zoukankan      html  css  js  c++  java
  • ReentrantLock锁源码分析

            在Java多线程中,可以使用 synchronized 关键字来实现线程之间同步互斥,但在JDK1.5中新增加了 ReentrantLock 类也能达到同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定、多路分支通知等功能,而且在使用上也比 synchronized 更加的灵活。

    根据下面代码分析下ReentrantLock 获得锁释放锁的过程

    ReentrantLock nonfairLock = new ReentrantLock();//默认的非公平锁
    nonfairLock.lock();
    nonfairLock.unlock();
    ReentrantLock fairLock = new ReentrantLock(true);//公平锁
    fairLock.lock();
    fairLock.unlock();

     默认构造函数

    1.lock()方法

    (AQS)AbstractQueuedSynchronizer.acquire()方法

    tryAcquire 方法

     

    nonfairTryAcquire 方法

     

     

    addWaiter 方法

    enq 方法

    return  t 为当前新增节点的上一个节点,目前没有发现这个返回有什么直接用处,addWaiter 方法就是把当前线程的节点放入AQS队列的尾部

    备注:   上述表述的同步队列即为aqs队列

    acquireQueued方法:加入队列后再次尝试获得锁

    shouldParkAfterFailedAcquire:尝试park当前线程

     

    2.unlock():释放锁

     

    unparkSuccessor:unpark线程

                 ReentrantLock公平锁其实上述非公平锁类似

                 非公平锁在获取锁的时候,会先通过CAS进行抢占,而公平锁则不会,

                 判断条件多了hasQueuedPredecessors()方法,也就是加入了同步队列中当前节点是否有前驱节点]的判断,如果该方法返回true,则表示有线程比当前线程更早地请求获取锁,因此需要等待前驱线程获                 取并释放锁之后才能继续获取锁。

                  

  • 相关阅读:
    WCF 第八章 安全 确定替代身份(中)使用AzMan认证
    WCF 第八章 安全 总结
    WCF 第八章 安全 因特网上的安全服务(下) 其他认证模式
    WCF Membership Provider
    WCF 第八章 安全 确定替代身份(下)模仿用户
    WCF 第八章 安全 因特网上的安全服务(上)
    WCF 第九章 诊断
    HTTPS的七个误解(转载)
    WCF 第八章 安全 日志和审计
    基于比较的排序算法集
  • 原文地址:https://www.cnblogs.com/dyg0826/p/10467514.html
Copyright © 2011-2022 走看看