版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34203492/article/details/82629752
简单说一下ReentrantReadWriteLock
简介
ReentrantReadWriteLock是一个读写锁,所谓读写锁,是对访问资源共享锁和排斥锁,一般的重入性语义为:如果对资源加了写锁,其他线程无法再获得写锁与读锁,但是持有写锁的线程,可以对资源加读锁(锁降级);如果一个线程对资源加了读锁,其他线程可以继续加读锁。
所以ReentrantReadWriteLock的写入锁只能有唯一的所有者,并且只能由获得该锁的线程来释放。
与ReentrantLock类似,ReentrantReadWriteLock在构造时也可以选择公平锁或者非公平锁。在公平锁中,等待时间最长的线程将优先获得锁。如果这个锁由读线程持有,而另一个线程请求写入锁,那么其他读线程都不能获得读取锁,直到写线程使用完并且释放了写入锁。在非公平锁中,线程获取访问许可的顺序是不确定的。写线程降级为读线程是可以的,但读线程升级为写线程是不可以的(这样会导致死锁)。
用一个代码演示一下ReentrantReadWriteLock:
代码来源于《java并发编程实战》程序清单13-7,注释是我自己加的 如有错误请谅解
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteMap<K, V> {
private final Map<K, V> map; //定义一个map
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock(); //读锁
private final Lock w = lock.writeLock(); //写锁
public ReadWriteMap(Map<K, V> map){ //构造
this.map = map;
}
public V put(K key, V value){ //put方法先加写入锁 然后进行写操作 在finally里面进行释放锁
w.lock();
try{
return map.put(key, value);
}finally {
w.unlock();
}
}
// 对remove(), putAll(), clear()等方法执行相同操作
public V get(Object key){ //get方法先加读锁 然后进行读操作 在finally里面进行释放锁
r.lock();
try {
return map.get(key);
}finally {
r.unlock();
}
}
// 对其他只读的Map方法执行相同的操作
}
介绍完毕
个人浅薄理解,欢迎补充
点击链接加入群聊【Java技术学习闲聊群】:https://jq.qq.com/?_wv=1027&k=59emCBA