使用读写锁简单实现缓存的实例
2016-08-03 21:19
489 查看
转载自:http://blog.csdn.net/lijunlinlijunlin/article/details/8686591
http://blog.csdn.net/lijunlinlijunlin/article/details/8686592
注意:
1. 重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想.
2. WriteLock可以降级为ReadLock,顺序是:先获得WriteLock再获得ReadLock,然后释放WriteLock,这时候线程将保持Readlock的持有.反过来ReadLock想要升级为WriteLock则不可能.
3. ReadLock可以被多个线程持有并且在作用时排斥任何的WriteLock,而WriteLock则是完全的互斥.这一特性最为重要,因为对于高读取频率而相对较低写入的数据结构,使用此类锁同步机制则可以提高并发量.
4. 不管是ReadLock还是WriteLock都支持Interrupt,语义与ReentrantLock一致.
5. WriteLock支持Condition并且与ReentrantLock语义一致,而ReadLock则不能使用Condition,否则抛出UnsupportedOperationException异常.
http://blog.csdn.net/lijunlinlijunlin/article/details/8686592
import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class CacheSystem { private Map<String, Object> cache = new HashMap<String,Object>(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); public Object getData(String key){ //先从缓存中去取数据,先加上读锁 rwl.readLock().lock(); Object obj = null; try{ obj = cache.get(key); if(obj == null){ //先解除读锁,在上写锁(必须先解除读锁才能成功上写锁) rwl.readLock().unlock(); rwl.writeLock().lock(); //去数据库取数据,再判断一次是否为null,因为有可能多个线程获得写锁 try{ if(obj == null){ obj = new String("obj is get from db"); } }finally{ //先上读锁,然后再解除写锁(这样可以成功完成,在解除写锁前获得读锁,写锁被降级--这翻译的api上的) rwl.readLock().lock(); rwl.writeLock().unlock();//解除写锁,读锁仍然持有 } } }finally{ rwl.readLock().unlock(); } return obj; } }
注意:
1. 重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想.
2. WriteLock可以降级为ReadLock,顺序是:先获得WriteLock再获得ReadLock,然后释放WriteLock,这时候线程将保持Readlock的持有.反过来ReadLock想要升级为WriteLock则不可能.
3. ReadLock可以被多个线程持有并且在作用时排斥任何的WriteLock,而WriteLock则是完全的互斥.这一特性最为重要,因为对于高读取频率而相对较低写入的数据结构,使用此类锁同步机制则可以提高并发量.
4. 不管是ReadLock还是WriteLock都支持Interrupt,语义与ReentrantLock一致.
5. WriteLock支持Condition并且与ReentrantLock语义一致,而ReadLock则不能使用Condition,否则抛出UnsupportedOperationException异常.
相关文章推荐
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- Java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- 使用WCF实现SOA面向服务编程——简单的WCF开发实例
- 使用WC“.NET研究”F实现SOA面向服务编程——简单的WCF开发实例
- 使用wxpython实现的一个简单图片浏览器实例
- LoadingCache简单实例,使用google缓存机制
- java并发-使用内置条件队列实现简单的有界缓存
- 一起谈.NET技术,使用WCF实现SOA面向服务编程——简单的WCF开发实例
- python3使用tkinter实现ui界面简单实例
- 使用wxpython实现的一个简单图片浏览器实例
- 使用NSURLProtocol实现UIWebView的离线缓存的简单实现
- 使用C++实现一套简单的状态机模型——实例
- 使用线性布局实现简单登陆界面的实例
- javaEE 使用ServletContext实现服务器端简单定时更新缓存
- 学习新事物:使用jquery+xml实现ajax简单实例
- 使用W“.NET技术”CF实现SOA面向服务编程——简单的WCF开发实例
- ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
- 缓存功能(简单的synchronized和使用读写锁)
- 并发编程 18—— 使用内置条件队列实现简单的有界缓存