首页 > 编程语言 >ReentrantLock源码

ReentrantLock源码

时间:2022-12-06 21:24:07浏览次数:44  
标签:AQS ReentrantLock Sync tryAcquire 源码 线程 公平 方法

ReentrantLock即是AQS线程同步队列器思想的具体应用/实现

实现了AQS,并有公平锁和非公平锁(默认非公平锁)两种实现

 

ReentrantLock有三个重要的内部类:Sync(抽象类),NonfaireSync(Sync的非公平锁实现),FairSync(Sync的公平锁实现)

 

Sync抽象类

nonfairTryAcquire()方法

如果State=0,尝试CAS获取锁;

否则,判断当前线程是不是已经拿到锁的线程(可重入=一个线程获取了锁再次尝试获取锁时不会出现死锁)

并累加State来记录重入次数。

*小细节:因为State是从0开始的累加值,为什么会判断nextc<0? 因为int为16位最大值为2147483647(允许重入的最大次数),超出即溢出为负数。

 

tryRelease()方法

实现的AQS的tryRelease

 返回值代表的是:是否完全被释放。

 

NonfaireSync(非公平锁)实现类

lock()方法

 非公平锁的lock方法,可以看到,上来就给一次机会,通过CAS设置全局状态值为1,设置成功即抢到锁。

这个机会抢不到,则使用AQS的acquire()方法去排队。

而公平锁那边的实现:直接去排队。

 

tryAcquire()方法 【override】

非公平锁中acquire()会调用tryAcquire()

 tryAcquire()调用nonfairTryAcquire()

在这里可以看到,非公平锁进行了2次CAS操作来尝试获取锁。若2次都失败,则去排队。

细节:为什么nonfairTryAcquire()方法会被定义在Sync抽象类(而不是非公平锁的实现类)中?

 

FaireSync(公平锁)实现类

lock()方法

直接调用AQS的acquire()方法排队

 

 AQS中acquire方法会调用tryAcquire方法。

tryAcquire()方法 【override】

如果锁空闲 并且 当前线程之前没有线程(即当前线程在队头,即排队排到我了) ,后面是一个短路与符号&&,则开始CAS获取锁,

后面的逻辑基本与前面的非公平锁一样。

这里保持了FIFO队列的公平特性,排队思想。

 

标签:AQS,ReentrantLock,Sync,tryAcquire,源码,线程,公平,方法
From: https://www.cnblogs.com/hangwei/p/16938029.html

相关文章

  • 很简单的源码剖析-SpringBoot内嵌Tomcat原理
    SpringBoot默认支持Tomcat,Jetty,和Undertow作为底层容器。而SpringBoot默认使用Tomcat,一旦引入spring-boot-starter-web模块,就默认使用Tomcat容器。<dependency><gr......
  • pop_heap 源码剖析
    一:用法示例一共两个重载:default(1)   template<classRandomAccessIterator> voidpop_heap(RandomAccessIteratorfirst, RandomAccessIteratorlast);cu......
  • make_heap 源码剖析
    一:用法示例一共两个重载:default(1)   template<classRandomAccessIterator> voidmake_heap(RandomAccessIteratorfirst, RandomAccessIteratorlast);c......
  • push_heap 源码剖析
    一:用法示例一共两个重载:default(1)   template<classRandomAccessIterator> voidpush_heap(RandomAccessIteratorfirst, RandomAccessIteratorlast);c......
  • is_heap和is_heap_until 用法与源码剖析
    一:用法示例is_heap一共两个重载:default(1)template<classRandomAccessIterator> boolis_heap(RandomAccessIteratorfirst, RandomAccessIteratorlast);cu......
  • Semaphore信号量源码解析(基于jdk11)
    目录1、Semaphore信号量源码解析(基于jdk11)1.1Semaphore概述1.2Semaphore的原理1.2.1基本结构(jdk11)1.2.2可中断获取信号量1.2.3公平模式1.2.4非公平模式1.2.4不......
  • 手机直播源码,文字上下滚动切换 用于公告消息提示
    手机直播源码,文字上下滚动切换用于公告消息提示1基本使用代码 voidmain(){ ///启动根目录 runApp(MaterialApp(  home:TestTipsPage(), ));}classTest......
  • CyclicBarrier循环屏障源码解析(基于jdk11)
    目录CyclicBarrier循环屏障源码解析(基于jdk11)1.1CyclicBarrier概述1.2CyclicBarrier原理1.2.1基本结构(jdk11)1.2.2await()方法1.2.3dowait方法1.2.3.1breakBarrie......
  • 直播app系统源码,Flutter MaterialButton 实现圆角边框按钮
    直播app系统源码,FlutterMaterialButton实现圆角边框按钮 MaterialButtonbuildMaterialButton(){  returnMaterialButton(   //背景颜色   color:......
  • Pixhawk控制电机命令pwm源码详解
    在用USB转串口连接好飞控板之后,可以在终端使用命令pwm来进行设置pwm的输出值例如:命令nsh>pwmtest–c13–p1200该命令用来测试通道1和3,并将他们的输出值设定为1200us。p......