工作中用到了读写锁,记录如下:
- 使用场景:多线程中某些代码块可以被多个线程同时读,但是当某块代码执行写操作时,被读的代码块需要变得不可读,直到写操作完成
@Test
public void testReadAndWriteLock() {
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 获取读锁
readWriteLock.readLock().lock();
try {
// 执行读锁中的业务逻辑
System.out.println("read lock");
try {
// 获取写锁之前要先释放读锁,否则会导致读锁和写锁之间的死锁
readWriteLock.readLock().unlock();
// 获取写锁
readWriteLock.writeLock().lock();
// 执行写锁中的业务逻辑
System.out.println("write lock");
// 执行完写锁中的业务逻辑后再把读锁锁上,否则finally中的释放读锁会出异常
readWriteLock.readLock().lock();
} finally {
// 释放写锁
readWriteLock.writeLock().unlock();
}
} finally {
// 释放读锁
readWriteLock.readLock().unlock();
}
}
运行结果如下:
↓...start test...↓
read lock
write lock
↑...end test...↑
Process finished with exit code 0
可以看到正常获取到了读锁和写锁,如果不按照以上代码的写法-不释放读锁而直接获取写锁,会出现死锁!!!