文章目录
读写锁、StampLock详解
ReentrantReadWriteLock
简介
适用于读多写少的场景,特点是读读不互斥,读写与写写互斥。
基本使用
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock r = readWriteLock.readLock();
private Lock w = readWriteLock.writeLock();
// 读操作上读锁
public Data get(String key) {
r.lock();
try {
// TODO 业务逻辑
}finally {
r.unlock();
}
}
// 写操作上写锁
public Data put(String key, Data value) {
w.lock();
try {
// TODO 业务逻辑
}finally {
w.unlock();
}
}
整体结构
读写锁有一个顶层规范接口
ReadWriteLock
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
我们常用的
ReentrantReadWriteLock
,它就实现了
ReadWriteLock
接口,并创建了两个内部类分别代表读锁和写锁。同时还有公平锁与非公平锁
public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable {
private static final long serialVersionUID = -6992448646407690164L;
/** 读锁 */
private final ReentrantReadWriteLock.ReadLock readerLock;
/** 写锁 */
private final ReentrantReadWriteLock.WriteLock writerLock;
/** 同步器 同时还定义了三个内部类,用来满足公平锁与非公平锁的实现*/
final Sync sync;
public ReentrantReadWriteLock() {
this(false);
}
public ReentrantReadWriteLock(boolean fair) {
// 同步器 公平锁与非公平锁
// 这里先创建好了sync对象,然后再传给读写锁,为读写锁中的sync属性赋值
sync = fair ? new FairSync() : new NonfairSync();
// 读写锁
readerLock = new ReadLock(this);
writerLock = new WriteLock(this);
}
// 实现ReadWriteLock接口,重写的两个方法
public ReentrantReadWriteLock.WriteLock writeLock() {
return writerLock; }
public ReentrantReadWriteLock.ReadLock readLock() {
return readerLock; }
......
}
ReentrantReadWriteLock
结构如下图所示,定义了五个内部类
读锁与写锁
Sync
类继承了
AbstractQueuedSynchronizer
类,而公平锁与非公平锁的两个类继承了
Sync
类
而读锁与写锁则是实现了
Lock
接口
读锁:
// 读锁实现了Lock接口,也就是实现接口中的抽象方法。在加锁与解锁的时候就是调用同步器中对共享锁操作的方法
public
版权声明:本文为qq_44027353原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。