前言Curator也支持分布式读写锁[1]和互锁[2],就用InterProcessReadWriteLock吧,一起来看看源码和执行。1、如何使用publicclassCuratorDemo{publicstaticvoidmain(String[]args)throwsException{StringconnectString="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";RetryPolicyretryPolicy=newExponentialBackoffRetry(1000,3work.AccuratorFrameworkcuratorFramework);Curatorbuilder().connectString(connectString).retryPolicy(retryPolicy).build();client.start();InterProcessReadWriteLocklock=newInterProcessReadWriteLock(client,"/locks/lock_01");lock.readLock().acquire();锁。readLock().release();lock.writeLock().acquire();lock.writeLock().release();}}2.源码读锁和写锁都是基于InterProcessMutex实现的,所以基本上都是与InterProcessMutex的区别无关。但是这里生成的锁名不再是-lock-,而是换成了__WRIT__和__READ__。读锁锁节点名称为/locks/lock_01/_c_44a8eaf8-f177-403a-92bf-9119591b54d5-__READ__0000000000,写锁解锁节点名称为_c_2e5dde98-c548-4f8b-a798-821ee8330eb6-__WRIT__00010创建节点和重入锁InterProcessMutex没有区别。唯一不同的是在internalLockLoop方法中,对锁获取结果的判断有所不同。锁可重入时,通过StandardLockInternalsDriver#getsTheLock判断当前节点是否为最小节点。读写锁重写了InterProcessReadWriteLock#InterProcessReadWriteLock中的getsTheLock方法。读锁读锁,当前线程直接返回成功,也就是说当前线程读写不互斥。如果是另一个线程,则遍历所有子节点。子节点包含写锁。如果当前节点在子节点有序集合中的索引小于写锁的索引,则直接获取锁,否则获取失败;如果子节点不包含写锁,当前节点在子节点有序集合中的索引
