4、深入 ReentrantReadWriteLock
4.1 为什么要出现读写锁
synchronized 和 ReentrantLock 都是互斥锁。
如果一个操作是读多写少,且需要保证线程安全,使用上述两种互斥锁效率会很低。
在这种情况下,可以使用 ReentrantReadWriteLock 读写锁去实现。
读读之间是不互斥的,可以并发执行。
但是如果涉及到了写操作,那么必须是互斥的操作。
static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
static ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
static ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
readLock.lock();
try {
System.out.println("子线程!");
try {
Thread.sleep(500000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
readLock.unlock();
}
}).start();
Thread.sleep(1000);
writeLock.lock();
try {
System.out.println("主线程!");
} finally {
writeLock.unlock();
}
}
4.2 读写锁的实现原理
ReentrantReadWriteLock 还是基于 AQS 实现的,对 state 进行操作,拿到锁资源就去干活,如果没有拿到,依然去 AQS 队列中排队。
- 读锁操作:基于 state 的高 16 位进行操作。
- :基于 state 的低 16 位进行操作。


