- A+
所属分类:未分类
概念
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。
实现方法
- 数据库实现
如获取锁使用 select * from lock where lock_name=xxx for update,首先这种做法性能不是特别好,超时后重新连接就乱了
- redis实现
redis的setnx,但是lock timeout的存在也使得失去了锁的意义
- zookeeper实现
zookeeper版本的分布式锁问题相对比较少,也是比较推崇的
思路: 在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker下创建临时顺序节点
public void doWork(long time, TimeUnit unit) { try { if ( !lock.acquire(time, unit) ) { throw new IllegalStateException(clientName + " could not acquire the lock"); } } catch (Exception e) { e.printStackTrace(); } try { System.out.println(clientName + " has the lock"); try { resource.use(); } catch (InterruptedException e) { e.printStackTrace(); } } finally { System.out.println(clientName + " releasing the lock"); try { lock.release(); // always release the lock in a finally block } catch (Exception e) { e.printStackTrace(); } } }
通过线程池来测试锁
for (int i = 0; i < QTY; ++i) { final int index = i; Callable<Void> task = new Callable<Void>() { @Override public Void call() throws Exception { CuratorFramework client = ClientConnect.createSimple(ZK_ADDRESS); try { System.out.println("zk client start successfully!"); client.start(); CuratorLocking example = new CuratorLocking(client, ZK_LOCK_PATH, resource, "Client " + index); for (int j = 0; j < REPETITIONS; ++j) { example.doWork(10, TimeUnit.SECONDS); } } catch (Exception e) { e.printStackTrace(); // log or do something } finally { CloseableUtils.closeQuietly(client); } return null; } }; service.submit(task); }
- 安卓客户端下载
- 微信扫一扫
- 微信公众号
- 微信公众号扫一扫