ReentrantReadWriteLock 可重入读写锁的理解
2012-11-01 10:39
561 查看
多线程读取并修必一个资源时,我们过去通常使用synchronized同步锁,这个是有性能损失的,很多情况下:资源对象总是被大量并发读取,偶尔有一个线程进行修改,也就是说:以读为主,修改不是很频繁,那么我们在JDK5中用ReentrantReadWriteLock就获得比synchronized更高并发性能,高并发性能是我们使用JDK5的主要目的,而不是annotaion和泛型等设计优点。
在使用ReentrantReadWriteLock 时应明确以下几点:
(1)在代码中添加读锁(lock.readLock().lock() ) 的目的:如果有一线程在读取数据时,此时恰好有另一线程,正以写锁的方式在修改该数据,此时读取数据的线程如果加了读锁,将被阻塞,直到另一线程的写锁被释放才能继续读,而如果读取数据的线程未加读锁,那么它的读将不被阻塞,就有可能读入被修改前的数据。总结:读锁离开了写锁就没有了意义
(2)重入:此锁允许 reader 和 writer 按照 ReentrantLoc 的样式重新获取读取锁或写入锁。在写入线程保持的所有写入锁都已经释放后,才允许重入 reader 使用它们。此外,writer 可以获取读取锁,但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁状态下执行读取操作的方法期间保持写入锁时,重入很有用。如果 reader 试图获取写入锁,那么将永远不会获得成功。
(3)锁降级:重入还允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的。
下面是JDK的一个例子,展示了如何利用重入来执行升级缓存后的锁降级(为简单起见,省略了异常处理):
在使用ReentrantReadWriteLock 时应明确以下几点:
(1)在代码中添加读锁(lock.readLock().lock() ) 的目的:如果有一线程在读取数据时,此时恰好有另一线程,正以写锁的方式在修改该数据,此时读取数据的线程如果加了读锁,将被阻塞,直到另一线程的写锁被释放才能继续读,而如果读取数据的线程未加读锁,那么它的读将不被阻塞,就有可能读入被修改前的数据。总结:读锁离开了写锁就没有了意义
(2)重入:此锁允许 reader 和 writer 按照 ReentrantLoc 的样式重新获取读取锁或写入锁。在写入线程保持的所有写入锁都已经释放后,才允许重入 reader 使用它们。此外,writer 可以获取读取锁,但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁状态下执行读取操作的方法期间保持写入锁时,重入很有用。如果 reader 试图获取写入锁,那么将永远不会获得成功。
(3)锁降级:重入还允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的。
下面是JDK的一个例子,展示了如何利用重入来执行升级缓存后的锁降级(为简单起见,省略了异常处理):
class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); // Recheck state because another thread might have acquired // write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); rwl.writeLock().unlock(); // Unlock write, still hold read } use(data); rwl.readLock().unlock(); } }
相关文章推荐
- 08____java新特性之读写锁(ReentrantReadWriteLock)
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- ReentrantReadWriteLock 读写锁获取与释放源码解析
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- java 可重入读写锁 ReentrantReadWriteLock 详解
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- ReentrantReadWriteLock 可重入的读写锁
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- Java中的锁——ReentrantReadWriteLock(读写锁)
- Java并发编程艺术——ReentrantReadWriteLock(读写锁)
- 【Java并发】- ReentrantReadWriteLock,读写锁原理
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- 聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁
- Java多线程之Lock的使用--重入锁(ReentrantLock)、Condition、公平锁和非公平锁、ReentrantReadWriteLock的使用(读写锁)
- 读写锁--ReentrantReadWriteLock
- ReentrantReadWriteLock可重入读写锁分析
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理