对读写锁的深入理解-读写锁技术的妙用---实现缓存
来源:互联网 发布:迅雷网络加速器 编辑:程序博客网 时间:2024/05/29 12:02
对读写锁的深入理解
参考:http://www.educity.cn/wenda/380140.html 其中有些小理解错误,大体可以接受
参考:http://www.wang1314.com/doc/topic-898895-1.html 主要通过其理解降级锁
1、对降级锁的理解
2、读写锁技术的妙用----读写锁实现缓存
1、锁降级
锁降级是指写锁降级为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不叫锁降级。锁降级是指把持住(当前拥有)写锁,再获取到读锁,然后释放(先前拥有的)写锁的过程。锁降级中读锁的获取是否有必要呢?答案是必要的。主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁,假设此刻另一个线程T获取了写锁了并修改了数据,那么当前线程无法感知到线程T的数据更新。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新。
ReentrantReadWriteLock并不支持锁升级(把持读锁,获取写锁,最后释放读锁的过程)。目的也是保证数据可见性。如果读锁已经被多个线程获取,其中任意线程成功获取了写锁并更新了数据,则其更新数其他获取到读锁的线程是不可见的。
理解:在jdk api中对ReentrantReadWriteLock可重入读写锁的加锁顺序的必要性
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(); } }
2、读写锁技术的妙用---读写锁实现缓存
代码处没有使用降级锁的顺序,多加了一个if判断,避免了其出错
public class CacheDemo {private Map<String, Object> cache = new HashMap<String, Object>();public static void main(String[] args) {} private ReadWriteLock lock = new ReentrantReadWriteLock(); public Object cache(Object value){ Object retVal = cache.get(value); lock.readLock().lock(); try{ if(retVal==null){ lock.readLock().unlock(); lock.writeLock().lock(); try{ if(retVal==null){ //此处锁的顺序没有符合降级锁的顺序,但是多加了一个if判断,不会有其影响 retVal ="aaa"; //实际上去查询数据库 } } finally{ lock.writeLock().unlock(); } lock.readLock().lock(); } } finally{ lock.readLock().unlock(); } return retVal; }}
0 0
- 对读写锁的深入理解-读写锁技术的妙用---实现缓存
- java5读写锁技术的妙用(十二)
- (9)java5的线程【锁lock】与【读写锁_以及模拟缓存(妙用)】技术
- (9)java5的线程【锁lock】与【读写锁_以及模拟缓存(妙用)】技术
- 码农小汪-缓存的原理 读写锁的实现缓存
- 用于缓存的读写锁
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- Java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- 读写锁的实现!
- 读写锁的实现
- 读写锁的实现
- 读写锁的实现
- linux读写锁的理解
- mysql 读写锁的理解
- linux读写锁的理解
- 使用读写锁简单实现缓存的实例
- ln命令
- css3弹性布局中的两列宽度自适应布局和两列右列宽度自适应布局
- JVM调优总结(十一)-反思
- Ubuntu装机必备
- [LeetCode]232. Implement Queue using Stacks
- 对读写锁的深入理解-读写锁技术的妙用---实现缓存
- 【C语言】Dev-C++ 调试方法简明图文教程
- 教你实现最简单的QQ消息item侧滑菜单
- 两种调试死锁的方法
- C++实验4-输出星号图
- 责任链模式的7种不同实现
- Https单向认证和双向认证
- Leetcode -- 20. Valid Parentheses
- 鸣人的影分身