zookeeper能够实现跨JVM的读写锁,而curator对此提供了API。
读写锁:读写互斥、写写互斥、读读不互斥。
实现类:
InterProcessReadWriteLock
接口类:
InterProcessLock
需要添加依赖
复制代码
org.apache.curator
curator-framework
2.12.0
org.apache.curator
curator-client
2.12.0
org.apache.curator
curator-recipes
2.12.0
复制代码
代码示例:
复制代码
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.framework.recipes.locks.InterProcessReadWriteLock;
import org.apache.curator.retry.ExponentialBackoffRetry;
/**
-
@author lay
-
@date 2018/09/12 15:20
*/
public class LocksDemo {private static InterProcessMutex readLock;
private static InterProcessMutex writeLock;static {
CuratorFramework client = CuratorFrameworkFactory.builder().connectString(“127.0.0.1:2181”).retryPolicy(new ExponentialBackoffRetry(3000, 1)).build();
client.start();
InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, “/user”);
readLock = lock.readLock();
writeLock = lock.writeLock();
}public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
public void run() {
System.out.println(“线程1启动”);
try {
readLock.acquire();
System.out.println(“获取读锁” + System.currentTimeMillis());
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
readLock.release();
System.out.println(“释放读锁” + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
System.out.println(“主线程休眠2秒”);
Thread.sleep(2000);
writeLock.acquire();
System.out.println(“获取写锁” + System.currentTimeMillis());
writeLock.release();
System.out.println(“释放写锁” + System.currentTimeMillis());
}
}
复制代码
我们先拿到一个framework,然后创建一个InterProcessReadWriteLock,就可以通过它拿到读写锁实例对象了。
在代码中,子线程获取了读锁,然后休眠3秒,而主线程这期间想要获取写锁,就得阻塞等待读锁释放,然后才能获取写锁。
在zookeeper中,其实读写锁是通过创建临时顺序节点来实现的