JAVA线程锁-读写锁应用,简单的缓存系统
2016-01-07 16:31
681 查看
在JAVA1.5版本以后,JAVA API中提供了ReadWriteLock,此类是一个接口,在它的实现类中ReentrantReadWriteLock中有这样一段代码
以上代码是一个简单的缓存实现方式,根据以上思路写出如下代码
注:此锁最多支持65535个递归写入锁和读锁,如果试图超出则抛出Error错误
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(); } }
以上代码是一个简单的缓存实现方式,根据以上思路写出如下代码
import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class CacheSystemTest { private Map<String, Object> cacheMap = new HashMap<String, Object>(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); /** * 为了防止在多线程情景下数据安全问题,需要线程互斥,实现方式是用锁 * @param key * @return */ public Object get(String key){ rwl.readLock().lock(); //任何一个线程进来后,第一时间加上读锁 Object obj = null; try{ obj = cacheMap.get(key); if(obj == null){ rwl.readLock().unlock(); //在赋值前关闭读锁,并在此检查对象 if(obj == null){ rwl.writeLock().lock(); //打开一个写锁 try{ obj = "read write lock"; }finally{ rwl.writeLock().unlock(); //关闭写锁 rwl.readLock().lock(); //恢复正常读锁 } } } }finally{ rwl.readLock().unlock(); } return obj; } }
注:此锁最多支持65535个递归写入锁和读锁,如果试图超出则抛出Error错误
相关文章推荐
- “鸡翁一值钱5,鸡母一值钱3,鸡雏三值钱1。百钱买百鸡,问鸡翁、母、雏各几何?”java穷举法解题
- 你真的搞明白Java中基本数据类型的转换了吗?
- java.lang.instrument 学习(一)
- 如何精确地测量java对象的大小
- java.security.InvalidKeyException: Illegal key size
- Atitit.软件命名空间 包的命名统计 及命名表(2000个名称) 方案java package
- Atitit.软件命名空间 包的命名统计 及命名表(2000个名称) 方案java package
- Atitit.软件命名空间 包的命名统计 及命名表(2000个名称) 方案java package
- Java Math的 floor,round和ceil的总结
- Java 注解 Annotation
- Spring-Boot初始篇
- JavaDom 学习笔记
- Java Beans API
- Java系统属性
- 无法debug断点跟踪JDK源代码——missing line number attributes的解决方法
- java免费发送邮件实现
- JAVA 多态
- Struts2中的包的作用描述
- java内存溢出分析(一)
- Java中的日期(Calendar、Date)