为什么需要升降级?
支持锁的降级,不支持升级:代码演示; 当写入过程降级为读锁,但是又不去释放锁,之后其他线程就可以读取了。
为什么不能升级?
会产生死锁,多个线程获取了读锁,然后都去竞争写锁,在多个线程互相等待对方释放读锁时,才能获取写锁,这样就陷入了死锁
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();}}
