问题内容已经在程序运行结果中通过注释的方式提出来了
问题内容:
为什么在 线程pool-1-thread-2 还未释放 读锁 的时候,线程pool-1-thread-3 能获取到 写锁
代码如下:
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReecentLock {
private static ReecentLock instance = new ReecentLock();
private Map<String,Object> map = new HashMap<>();
private ReadWriteLock lock = new ReentrantReadWriteLock();
public Object getData(String key) throws InterruptedException {
lock.readLock().lock();
Object value = null;
System.out.println(Thread.currentThread().getName() + " 已经获取 读锁");
try {
value = map.get(key);
if(value == null){
System.out.println(Thread.currentThread().getName() + "准备释放读锁");
lock.readLock().unlock();
System.out.println(Thread.currentThread().getName() + "释放读锁");
lock.writeLock().lock();
System.out.println(Thread.currentThread().getName() + "已经获取 写锁");
try {
value = map.get(key);
if(value == null){
System.out.println(Thread.currentThread().getName() + "----value----" + value);
value = "ddddd";
map.put(key,value);
System.out.println(Thread.currentThread().getName() +"设置缓存值");
}
}finally {
lock.writeLock().unlock();
System.out.println(Thread.currentThread().getName() + "已经释放 写锁");
}
lock.readLock().lock();
System.out.println(Thread.currentThread().getName() + "再次获取 读锁");
}
}finally {
lock.readLock().unlock();
System.out.println(Thread.currentThread().getName() + "再次释放 读锁");
}
System.out.println(value);
return value;
}
private ReecentLock(){};
public static ReecentLock getIntance(){
return instance;
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i=0;i<3;i++){
executorService.execute(() -> {
try {
ReecentLock.getIntance().getData("hello");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}
运行结果如下:
pool-1-thread-2 已经获取 读锁
pool-1-thread-3 已经获取 读锁
pool-1-thread-1 已经获取 读锁
pool-1-thread-3准备释放读锁
pool-1-thread-2准备释放读锁
pool-1-thread-3释放读锁
pool-1-thread-1准备释放读锁
pool-1-thread-1释放读锁
pool-1-thread-3已经获取 写锁 //问题就在这里,这里已经获取到了写锁,可是,此时还有一个线程的读锁还没有释放
pool-1-thread-3----value----null
pool-1-thread-3设置缓存值
pool-1-thread-2释放读锁 // 这个线程的读锁还没释放
pool-1-thread-2已经获取 写锁
pool-1-thread-2已经释放 写锁
pool-1-thread-1已经获取 写锁
pool-1-thread-3已经释放 写锁
pool-1-thread-2再次获取 读锁
pool-1-thread-1已经释放 写锁
pool-1-thread-2再次释放 读锁
pool-1-thread-3再次获取 读锁
ddddd
pool-1-thread-1再次获取 读锁
pool-1-thread-3再次释放 读锁
ddddd
pool-1-thread-1再次释放 读锁
ddddd