[关闭]
@adamhand 2019-01-22T13:40:24.000000Z 字数 2209 阅读 860

Java并发之ReentrantReadWriteLock


概念

顾名思义,ReentrantReadWriteLock名为“可重入读写锁”,它维护两个锁:读锁和写锁。在没有写锁的情况下,读锁允许多个线程同时访问,而写锁是独占的,

ReentrantReadWriteLock主要特性有以下几个:

使用

ReentrantReadWriteLock可以用来提高某些集合的并发性能。当集合比较大,并且读比写频繁时,可以使用该类。

读写锁的简单示例如下:

  1. class Cache{
  2. static Map<String, Object> map = new HashMap<String, Object>();
  3. static ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  4. static Lock r = rwLock.readLock();
  5. static Lock w = rwLock.writeLock();
  6. //获取一个key对应的value
  7. public static final Object get(String key){
  8. r.lock();
  9. try {
  10. return map.get(key);
  11. }finally {
  12. r.unlock();
  13. }
  14. }
  15. //设置key对应的value值
  16. public static final Object put(String key, Object value){
  17. w.lock();
  18. try {
  19. return map.put(key, value);
  20. }finally {
  21. w.unlock();
  22. }
  23. }
  24. //清空所有内容
  25. public static final void clear(){
  26. w.lock();
  27. try {
  28. map.clear();
  29. }finally {
  30. w.unlock();
  31. }
  32. }
  33. }

锁降级的示例如下:

  1. class LockDec{
  2. static ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  3. static Lock readLock = rwLock.readLock();
  4. static Lock writeLock = rwLock.writeLock();
  5. public volatile boolean update = false;
  6. public void processData(){
  7. readLock.lock();
  8. if (!update){
  9. //必须先释放读锁
  10. readLock.unlock();
  11. //锁降级从写锁获取到开始
  12. writeLock.lock();
  13. try {
  14. if (!update){
  15. //准备数据的流程
  16. update = true;
  17. }
  18. readLock.lock();
  19. }finally {
  20. writeLock.unlock();
  21. }
  22. //锁降级完成,写锁降级为读锁
  23. }
  24. try {
  25. //使用数据的流程
  26. }finally {
  27. readLock.unlock();
  28. }
  29. }
  30. }

当数据发生变更后 ,update变量被设置为true,此时所有访问processData()方法的线程都能感知到变化。

基本原理

ReentrantReadWriteLock底层也是使用AQS实现的,但是AQS中只有一个state域,这样就有了几个问题:

ReentrantReadWriteLock的解决办法总结起来有以下几个:

未完待续...

参考

ReentrantReadWriteLock读写锁详解
JUC 可重入 读写锁 ReentrantReadWriteLock
【死磕Java并发】—–J.U.C之读写锁:ReentrantReadWriteLock
Java并发编程--ReentrantReadWriteLock
深入理解读写锁—ReadWriteLock源码分析
读写锁 ReetrantReadWriteLock

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注