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更新同步状态抢锁

  • 相关阅读:
    使用 Content-Encoding: br 替换 Content-Encoding: gzip
    fusionjs 学习一 基本试用
    fusionjs uber开源的通用web插件化开发框架
    wiremock docker 运行
    QLoo graphql engine 学习三 架构
    QLoo graphql engine 学习二 基本试用(kubernetes)
    QLoo graphql engine 学习一 基本试用(docker&&docker-compose)
    使用rollup 开发专业js library
    QLoo graphql engine了解
    Oracle数据库查看用户状态
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/14010607.html
Copyright © 2011-2022 走看看