zoukankan      html  css  js  c++  java
  • 重入锁ReentrantLock详解

    重入锁ReentrantLock详解 

       ReentrantLock 实现自AQS队列同步器,其字面意思是可以重复进入的锁,其功能也如其名,在一个同步代码块中,可以多次调用 lock() 进行上锁,当然也需要对其进行多次解锁,才能使同步状态归0,其它线程才能重新获得锁。

      重入锁又分为非公平锁和公平锁两种实现,默认实现为非公平锁,要实现公平锁,在new对象时在构造参数中传入参数true即可。非公平锁上锁过程不会管先后顺序,谁先更新到同步状态谁就获得了锁。而公平锁会根据上锁的顺序,将线程放入队列中,依次执行。从效率上讲公平锁消耗更多资源,因为它要协调这种先后执行顺序。

    一、非公平锁

      1.非公平锁上锁

       高清图被浏览器压缩了,有些变糊了。可以复制下载下来看。

      总结:

      (1)非公平重入锁首先尝试CAS更新同步状态,即抢锁;

      (2)抢锁失败会先调用非公平锁重写的tryAcquire方法,如果当前同步状态为0,那么也尝试CAS更新同步状态进行抢锁;

      (3)如果同步状态不为0,则判断是否是当前线程重复上锁

      (4)还是失败,则进入队列,在当前节点的前置节点为头节点时,开始尝试抢锁;

      (5)抢锁成功,完

    二、非公平锁

      1.上锁

      代码的区别如下,就在hasQueuedPredecessors方法,此方法判断当前线程是否有前置的线程节点在等待,有则继续自旋或等待,没有则进行CAS更新同步状态抢锁

  • 相关阅读:
    面向对象的分析与设计
    Django的ORM补充
    JDBC数据库连接池
    Python 中的深浅拷贝
    智能机系统分析
    hyperf框架学习
    HTTP协议知识
    百度知道有关php抓取问题
    awk之FS的指定
    从DELPHI到JAVA[delphi]
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/14010607.html
Copyright © 2011-2022 走看看