利用读写锁模拟一个缓存系统
来源:互联网 发布:运行java文件 编辑:程序博客网 时间:2024/06/04 17:48
一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,
当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.
当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须直到所有的线程释放锁.
package multithreading;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;//利用读写锁模拟一个缓存系统//session.load(缓存,没有命中再去数据库中查询)没查到抛异常//session.get(数据库查询)没查到nullpublic class ReadWriteLockTest {//用Map模拟缓存数据private Map<String, String> cache=new HashMap<String, String>();//control+t可以查看ReadWriteLock集成目录结构private ReadWriteLock lock=new ReentrantReadWriteLock();public static void main(String[] args) {// TODO Auto-generated method stub}//读取缓存的时候允许多个线程同时读取(提高效率),但一个时间内只有一个线程能写public String getDate(String key){lock.readLock().lock();//上读锁允许多个线程同时读取String value=null;try {value = cache.get(key);//去缓存里取数据if(value==null){//缓存中没有数据try {lock.readLock().unlock();//先释放读锁(此时3个线程同时达到这里)lock.writeLock().lock();//让后上写锁(其中一个线程先上了写锁,另外2个就要等后)if(value==null){//再次判断(以防第一个线程做完数据库操作后另外2个已经进来的线程再次做读取数据库操作)value="queryDB()正在读取数据库(耗时操作)";}}finally{lock.writeLock().unlock();//释放写锁}lock.readLock().lock();//重新上读锁}}finally{lock.readLock().unlock();//最后不管怎么样都要释放读锁}return value;}}
- 利用读写锁模拟一个缓存系统
- 利用读写锁写一个缓存系统
- 用读写锁实现一个缓存系统
- 线程学习之读写锁模拟缓存系统
- 利用读写锁简单实现一个缓存demo
- 【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
- 【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
- 读写锁实现缓存系统
- 读写锁实现模拟缓存池
- JAVA 并发编程-读写锁之模拟缓存系统(十一)
- JAVA 并发编程-读写锁之模拟缓存系统(十一)
- 设计一个缓存系统 java多线程读写锁的应用
- 《黑马程序员》 读写锁之缓存系统
- 多线程 : 读写锁实现缓存系统
- 读写锁实现缓存系统demo
- java读写锁设计缓存系统
- 使用读写锁设计缓存系统
- 根据读写锁设计一个缓存类
- 关于objdump和objcopy的研究
- JS中的弹出窗口
- hdu 2133 what day it is?
- 大学有感
- Java基础入门
- 利用读写锁模拟一个缓存系统
- Reverse Integer
- MyEclipse 安装SVN SVN Connector
- Java基础——多线程
- 将数组a中的n个整数按相反的顺序存放
- 程序设计
- 课堂笔记-工厂模式
- java 线程运行等级
- 用户登录模块实现(struts2+Guice3.0)