ReentrantReadWriteLock读写锁
- 使用
读-读
不互斥读-写
,写-读
,写-写
都互斥
- 注意事项
- 读锁不支持条件变量
- 重入时锁升级不支持(读锁后加写锁)
- 重入时锁降级支持(写锁后加读锁)
- 应用缓存
- 问题分析
- HashMap线程不安全
- 多线程同时读取操作,任然会多次读取数据库
- 多线程修改数据库时,可能会造成脏数据(要先修改数据库,再清空缓存)但是仍然会有可能出现脏数据,但是再读一次就是正确的数据了
- 实现
- 使用读写锁
- 给写的方法添加写锁
- 给读的方法在读取的时候添加读锁,在查询数据库,放入缓存时添加写锁(这里可能会出现多个线程同时进入了查询数据库操作,虽然只有一个线程进来查询数据库,但是当这个线程释放读锁之后,其他线程本不应该再次查询数据库,所以这里需要再从缓存中获取一次,实现双重检查)
- 优化
- 问题分析
- 原理
- state(32位) :低16位表示写锁的state,高16位标识读锁的state