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

    1. public class Upgrading {
    2. private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    3. private static ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
    4. private static ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
    5. private static void readUpgrading(){
    6. readLock.lock();
    7. try {
    8. System.out.println(Thread.currentThread().getName()+"得到了读锁,正在读取");
    9. Thread.sleep(1000);
    10. System.out.println("");
    11. System.out.println("升级会带来阻塞");
    12. writeLock.lock();
    13. System.out.println("获取到了写锁,升级锁成功");
    14. } catch (InterruptedException e) {
    15. e.printStackTrace();
    16. } finally {
    17. readLock.unlock();
    18. System.out.println(Thread.currentThread().getName()+"释放读锁");
    19. }
    20. }
    21. private static void writeDownGrading(){
    22. writeLock.lock();
    23. try {
    24. System.out.println(Thread.currentThread().getName()+"得到了写锁,正在写入");
    25. Thread.sleep(1000);
    26. readLock.lock();
    27. System.out.println(Thread.currentThread().getName()+"在不释放写锁的情况下,直接获取读锁,成功降级");
    28. } catch (InterruptedException e) {
    29. e.printStackTrace();
    30. } finally {
    31. System.out.println(Thread.currentThread().getName()+"释放写锁");
    32. writeLock.unlock();
    33. }
    34. }
    35. public static void main(String[] args) throws InterruptedException {
    36. // 演示降级
    37. Thread thread = new Thread(() -> {
    38. writeDownGrading();
    39. }, "Thread-1");
    40. thread.start();
    41. thread.join();
    42. // 演示升级
    43. Thread thread1 = new Thread(() -> readUpgrading(), "thread-2");
    44. thread1.start();
    45. }
    46. }