正确的姿势如下:保证在写锁没释放前转化为读锁,写锁紧接着释放,其他线程的读就可以进去了
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
new Thread(() -> {
w.lock();
//writing
r.lock(); //同一线程写-读不互斥
w.unlock();
//reading
System.out.println("我已经降级了");
try {Thread.sleep(2000L);} catch (InterruptedException e) {}
r.unlock();
}).start();
new Thread(() -> {
r.lock();
//reading
System.out.println("我能进去");
r.unlock();
}).start();
注意同一个线程先读锁,后写锁,写锁是不能直接进去的
//单个线程 读-写 互斥,不存在锁升级
r.lock();
w.lock(); //需要等持有读锁的其他线程都把读锁释放掉
System.out.println("ok");
w.unlock();
r.unlock();