JDK17 ReentrantLock 简述 lock、unLock

  • 背景
  • 读代码
    • lock()
      • 这里会有疑问,什么是 state 属性,什么是队列呢,说说我自己的理解?
    • unLock()
  • 整体架构评价

背景

  • 最近无聊翻一翻 juc ,想看 AQS 入队的是怎么入队的,由于代码量比较大,就想先看了 ReentrantLock 入队操作,然后举一反三,由于我看的是 JDK 17 的版本,与 JDK 8 可能不一样,先不去考证 JDK 8 内容,只看 JDK 17 的代码,并且只讨论 ReentrantLock 中的方法

读代码

lock()

  • 首先肯定要读 lock() 和 unLock() 两个方法,实际写代码就是用这两个完成重入锁操作
 public void lock() {sync.lock();}

肯定走这个方法了吧,当我 ctrl + 鼠标左键调到具体方法时,发现并没有这样显示:

而是直接跳到了

     @ReservedStackAccessfinal void lock() {if (!initialTryLock())acquire(1);}

这个 initialTryLock() 是一个抽象方法,而 acquire(1) 调用的是 AQS 类的方法,AQS 的类代码先不讨论,反正不管公平还是非公平锁最后都调用 acquire(),也就是入队也是 acquire() 的简称 ;
先看 ReentrantLock 的内容,当我点击 initalTryLock() 方法时出现了,公平锁和非公平锁两个选项:

现在比较一下两个不同的 initialTryLock() 实现:
在 idea 中打开两个相同的类

两部分代码其实只有红色的部分不一样:

相比较之下只是公平锁多出了:

         int c = getState();if (c == 0) {if (!hasQueuedThreads()

很好理解,先获取 AQS 中 state 变量的属性,如果属性是 0,再去看线程队列中有没有人排队,没人排队再去竞争下,很显然公平锁还是讲武德的,别人在排队了,我就不去竞争了;相比较,非公平锁,来了就去竞争下,没竞争到再入队,这年轻人xxxx;

这里会有疑问,什么是 state 属性,什么是队列呢,说说我自己的理解?

  • 要从 AQS 设计说起,AQS 本身就是一个普通抽象类,与我们平时自己写的抽象类一样,里面有一个用 volatile 关键字修饰 int 类型的成员变量 state ,因为有 volatile 关键字修饰,那么多个线程都能看见这个 state ,如果多个线程竞争同一个资源时,都去参考 state 的值,这个 AQS 不就相对于一把锁了吗,当 state=0 时,代表没人竞争,代码继续执行,当 state > 0 时,代表有人持有这个资源,就去等待,等持有锁的线程执行完再去竞争资源,执行这个锁与 synchronized 相比哪个性能好先不去讨论,先看 lock 时引出的两个问题;

  • 一个是 state 是值从 0 变为大于 0 ,怎么保证原子性,另一个是当 state > 0,等待的线程去哪里等待或者叫记录他们线程信息 和 先来后到顺序;第一个问题有 cas 算法呀,第二个使用 node 队列解决, node 有一个属性 waiter 记录线程信息,队列来保证先来后到顺序;这不就行了吗

  • 当 state >1 代表什么呢,在 ReentrantLock 中代表重入次数,在 CountDownLatch 中代表倒计次数开门闩,其他的 juc 类没怎么看,就不说了;

unLock()

unLock() 代码 ReentrantLock 的公平锁和非公平锁调用的是同一套释放锁方法:

 public void unlock() {sync.release(1);}public final boolean release(int arg) {if (tryRelease(arg)) {signalNext(head);return true;}return false;}@ReservedStackAccessprotected final boolean tryRelease(int releases) {int c = getState() - releases;if (getExclusiveOwnerThread() != Thread.currentThread())throw new IllegalMonitorStateException();boolean free = (c == 0);if (free)setExclusiveOwnerThread(null);setState(c);return free;}

这里就不展开说了,写的有点长了, tryRelease(arg) 就是 tryRelease(1),tryRelease(1) 就是把 AQS 中的 state 属性减 1,当减到 0 时,返回 ture,通知 AQS 队列头结点的下一个;

整体架构评价

  • 在看 JDK17 的 ReentrantLock 时我发现代码结构更精简了。以前我以为有两个内部类 FairSync 和 NonFair ,现在有多了一个 Sync 类,把 FairSync 和 NoFair 的共有属性放到了 Sync 类,首先FairSync 和 NonFairSync 都变精简了,其次方便观察实现不同:

JDK17 ReentrantLock 简述 lock()、unLock()相关推荐

  1. 抽象同步器AQS、CAS应用之--ReentrantLock,lock和unlock的流程、源码分析

    文章目录 1. AQS和CAS 1.1 CAS存在的bug:ABA问题 2. ReentrantLock和synchronized的区别 3. ReentrantLock的内部结构 3.1 lock. ...

  2. java lock unlock_【Java并发007】原理层面:ReentrantLock中lock()、unlock()全解析

    一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...

  3. dx9 lock unlock效率太低_synchronized的缺陷,Lock的诞生

    一.前言 二.synchronized局限性 + Lock锁机制的引入 2.1 synchronized局限性 第一,使用synchronized,其他线程只能等待直到持有锁的线程执行完释放锁(syn ...

  4. 为什么await()后会执行lock.unlock,await()时不就释放锁了吗

    为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...

  5. synchronized与(ReentrantLock)Lock的对比区别

    类别 synchronized Lock 存在层次 Java关键字,属于原生语法层面 需要jvm实现 而Lock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配 ...

  6. Lock/Unlock Account - Active Directory

    根据IsAccountLocked属性来判断Account是否Lock/Unlock,因为LDAP provider不支持IsAccountLocked属性,这里采用WinNT Provider:(注 ...

  7. oracle 查询unlock,oracle account lock/unlock

    oracle account lock/unlock 2016-02-01 密码错误时候仍然不断的尝试登陆oracle,在登陆10次时会被告知test用户被锁. 1.用dba角色的用户登陆,进行解锁, ...

  8. NOR FLASH (mx25u12835f) lock/unlock功能及linux对其支持

    修改记录:v1.0,完成于2020-2-9 1 NOR FLASH (mx25u12835f) lock/unlock功能介绍 Lock/unlock功能表示对FLASH某些区域或全部进行数据保护,即 ...

  9. C++11多线程,thread库; mutex类,成员函数lock(), unlock();unique_lock<mutex>模板类

    文章目录 进程和线程 1. 进程 2. 线程 C++11多线程编程 1. C++11新标准 2. 创建线程 1. 普通函数 2. 仿函数 3. 成员函数 4. 多线程数据保护(数据一致性) 进程和线程 ...

最新文章

  1. 常用Apache Commons工具类备忘
  2. SpringBoot实现懒加载@Lazy
  3. AI in RTC 创新挑战赛,决赛打响
  4. linux下无root权限安装python2.7和pip以及安装cuda9.0,cudnn7.4,pytorch-gpu
  5. mysql数据库对象管理_MySQL管理与优化(15):优化数据库对象
  6. c#文件分割与合并 part 1 (转自互联网)
  7. 没有什么不可能!郴州女孩江梦南,从双耳失聪到清华博士!
  8. 计算机导论学后感5000字,大学计算机导论论文3000字
  9. 23种设计模式JAVA案例
  10. 屏幕录像专家录制超清视频教程-王西猛-专题视频课程
  11. 三角函数中的和差化积公式编辑方法
  12. 劣币驱逐良币,人吃人的中国职场环境还能走多远
  13. 计算机视觉研究院手把手教你深度学习的部署(手势识别,源码已开源)
  14. ConcurrentLinkedQueue 源码解析(JDK8)
  15. 【Linux】gcc/g++
  16. Linux文本处理三剑客sed详解(正则匹配、命令示例)
  17. HOUDINI 平面漩涡
  18. 关于AML芯片电视,风行刷机包的自定义和去广告的研究
  19. 【STM32F407】第4章 ThreadX FileX文件系统移植到STM32F407(SD卡)
  20. linux 下 POCO 安装

热门文章

  1. OSChina 周二乱弹 —— 人家BAT出身,专业清洁经验三十年
  2. 计算机社团基础,计算机社团招新策划
  3. PEG包裹碳化硅(SiC)量子点荧光材料
  4. feign.RetryableException: Connection refused (Connection refused) executing GET http://localhost:909
  5. 2018 年度阿里云存储十大新闻盘点篇 1
  6. 百度AI使用方案:黑白图片上色
  7. 让你的linux fedora 超过mac帅
  8. 《大话设计模式》读书总结
  9. Android学习笔记六十:无线 WIFI 的13个信道频率范围
  10. Free HEIC Converter(heic格式转换器)v1.0.6官方版