zoukankan      html  css  js  c++  java
  • ReentrantReadWriteLock可重入,锁升级,锁降级

    public class ReentrantReadWriteLockTest {
    
        
        public static void main(String[] args) throws InterruptedException {
            // testReenter();
            // testUpgrade();
             testDowngrade();
        }
    
        /**
         * 在同一个线程中,在没有释放写锁的情况下,就去申请读锁,这属于锁降级,ReentrantReadWriteLock是支持的,不过锁的释放有问题,获取到锁就要释放锁
         * 为什么有锁的降级,当前线程进行写操作后, 当前线程后面可能还有读的操作,把写锁降级为读锁后,其他的线程可以进行读,但是不能写,提高了效率。
         */
        public static void testDowngrade() {
            ReentrantReadWriteLock rtLock = new ReentrantReadWriteLock();
            rtLock.writeLock().lock();
            System.out.println("writeLock");
            rtLock.readLock().lock();
            System.out.println("get read lock");
        }
    
        // 在同一个线程中,在没有释放读锁的情况下,就去申请写锁,这属于锁升级,ReentrantReadWriteLock是不支持的。
        public static void testUpgrade() {
            ReentrantReadWriteLock rtLock = new ReentrantReadWriteLock();
            rtLock.readLock().lock();
            System.out.println("get readLock.");
            // rtLock.readLock().unlock();
            rtLock.writeLock().lock();
            System.out.println("blocking");
            rtLock.writeLock().unlock();
        }
    
        
        //可重入锁,就是说一个线程在获取某个锁后,还可以继续获取该锁,即允许一个线程多次获取同一个锁,要注意的是获取多少次锁就要释放多少次锁,不然会发生死锁,例子讲的是两次获取写锁
        public static void testReenter() throws InterruptedException {
            final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    lock.writeLock().lock();
                    System.out.println("Thread real execute");
                    lock.writeLock().unlock();
                }
            });
    
            lock.writeLock().lock();
            lock.writeLock().lock();
            t.start();
            Thread.sleep(200);
            System.out.println("realse one once");
            lock.writeLock().unlock();
            // lock.writeLock().unlock();
        }
    
    }
  • 相关阅读:
    基于Redis的短链接设计思路
    再谈对协变和逆变的理解(Updated)
    Java基础—ClassLoader的理解
    遇到个小问题,Java泛型真的是鸡肋吗?
    一次失败升级后的反思
    JVM是如何分配和回收内存?有实例!
    一个Java对象到底占用多大内存?
    《深入理解Java虚拟机》读书笔记:垃圾收集器与内存分配策略
    快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
    快速掌握RabbitMQ(一)——RabbitMQ的基本概念、安装和C#驱动
  • 原文地址:https://www.cnblogs.com/moris5013/p/11764153.html
Copyright © 2011-2022 走看看