ReenTrantLock原理学习

  1. 基于AQS的
  2. 可重入锁:单个线程在执行时,重新进入一个子程序,仍然是线程安全的。(线程a在某个上下文获取到锁,当a线程想要再次获取锁,不会阻塞,只是获取到锁n次,相应的释放锁也需要n次。)
  3. 可以实现公平锁和非公平锁。有共同的父类,抽象类,FairSync和NonFairSync是final修饰的。
    1. 公平锁是按照请求锁的顺序分配的(FIFO队列实现),有稳定的获取锁的机会,但是性能要低于非公平锁。内部类FairSync中两个方法、lock方法直接返回sync类的acquire方法,tryAcquire方法判断当前锁是否空闲和队列是否为空,如果不满足其一,则插入队列,老老实实排队吧!
    2. 非公平锁是抢占式的,即谁抢到谁的,不一定拥有锁的机会,但是性能比公平锁要高。NonFairSync方法中,lock方法之间获取锁,cas操作,不成功调用sync类的acquire方法,tryAcquire方法调用sync类的nonfailrTryAcquire方法。
    3. 非公平锁性能搞得原因主要是抢占式不用多次进行线程的唤醒,而挂起线程的唤醒会产生短暂的延迟。非公平锁可以利用这段时间来完成操作。
  4. 实现更加灵活的调度
    1. Java中断机制、三个interrupt(设置中断标志)、isInterrupted(放回中断标志)、interrupted(放回中断标志、并初始化值为false)
posted @ 2022-03-13 09:36  牵魂  阅读(41)  评论(0)    收藏  举报