利用Java的读写锁实现缓存的设计
2024-10-19 05:21:43
Java中的读写锁:
多个读锁不互斥, 读锁与写锁互斥, 写锁与写锁互斥, 这是由JVM自行控制的,我们只要上好相应的锁即可。
缓存的设计:
package com.cn.gbx; import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; public class CacheDesign {
private Map<String, Object> cache = new HashMap<String, Object>();
//对象锁的设计
// public synchronized Object getData(String key){
// Object value = null;
// value = cache.get(key);
// if (value == null) {
// value = "queryDao";
// cache.put(key, value);
// }
// return value;
// }
//可重入锁的设计
static ReadWriteLock rwl = new ReentrantReadWriteLock();
public synchronized Object getData(String key){
Object value = null;
rwl.readLock().lock();
try {
value = cache.get(key);
if (value == null) {
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if (value == null) { //确保后边的线程不会重读写
value = "queryDao";
cache.put(key, value);
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
} public static void main(String[] args) { }
}
最新文章
- 菜鸟git学习
- mysql 查询去重 distinct
- 扫描二维码自动识别手机系统(Android/IOS)
- docker 会这些也够
- sql server 2008 操作数据表
- 手机端Post 数据
- C# XML序列化操作菜单
- Mac设置
- 《JavaScript网页特效经典300例-高级篇》
- redis事务、管道及消息通知探究
- oracle查询锁表解锁语句
- 为什么Java 两个Integer 中1000==1000为false而100==100为true?
- Lintcode227 Mock Hanoi Tower by Stacks solution 题解
- 浅析GDAL库C#版本支持中文路径问题(续)
- Niop2017初赛滚粗记
- redis 基本原理及安装
- Immunity Debugger学习 二
- 理解Liang-Barsky裁剪算法的算法原理
- day13,day14
- 【BZOJ1560】[JSOI2009]火星藏宝图(贪心,动态规划)