为什么需要升降级?
支持锁的降级,不支持升级:代码演示; 当写入过程降级为读锁,但是又不去释放锁,之后其他线程就可以读取了。
为什么不能升级?
会产生死锁,多个线程获取了读锁,然后都去竞争写锁,在多个线程互相等待对方释放读锁时,才能获取写锁,这样就陷入了死锁
public class Upgrading {
private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
private static ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
private static ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
private static void readUpgrading(){
readLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"得到了读锁,正在读取");
Thread.sleep(1000);
System.out.println("");
System.out.println("升级会带来阻塞");
writeLock.lock();
System.out.println("获取到了写锁,升级锁成功");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock();
System.out.println(Thread.currentThread().getName()+"释放读锁");
}
}
private static void writeDownGrading(){
writeLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"得到了写锁,正在写入");
Thread.sleep(1000);
readLock.lock();
System.out.println(Thread.currentThread().getName()+"在不释放写锁的情况下,直接获取读锁,成功降级");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName()+"释放写锁");
writeLock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
// 演示降级
Thread thread = new Thread(() -> {
writeDownGrading();
}, "Thread-1");
thread.start();
thread.join();
// 演示升级
Thread thread1 = new Thread(() -> readUpgrading(), "thread-2");
thread1.start();
}
}