Java 的jdk级别的锁主要是在JUC包下,包括atomic包下的乐观锁和locks包下的悲观锁。今天来介绍一下locks包下的悲观锁(由于百家号对markdown支持不好,代码只能以图片的方式展示了)

ReentrantLock

ReentrantLock实现了Lock接口,是可重入锁,它是支持公平锁和非公平锁的。下面从加锁和解锁的过程分析一下ReentrantLock。

1、加锁lock()

lock操作是分为公平和非公平两种方式的,公平锁顾名思义就是先到先得,先到的线程先拿到锁,后到的线程需要排队,等到前面的线程释放锁之后才能拿到锁,这种方式的缺点是吞吐量小,因为在等待CPU的调度是需要耗费时间的;非公平锁是先去尝试获取锁,如果拿到锁就成功了,如果拿不到再去排队获取锁,这种方式相比公平锁而言,就少了唤醒排队锁时所需要的时间,吞吐量会比公平锁高。

ReentrantLock和AQS使用了模板设计模式,固定的处理方法都在AQS抽象类中

非公平锁的lock

公平锁的lock

对于公平锁和非公平锁都用到的方法,都是在AQS中,如下:

addWaiter方法构造一个Node放到队尾

2、解锁unlock()

unlock方法调用了AQS的release方法

在ReentrantLock中重写了tryRelease方法,主要操作就是把state值减一

tryRelease成功之后,就要去唤醒它的继任者,unparkSuccessor同样是在AQS中实现

3、使用

在源码中,也给出了简单的使用例子,但是我觉得在jdk源码中的类LinkedBlockingQueue使用ReentrantLock还是比较适合参照的,下面以代码的形式展示ReentrantLock的使用方式

ReentrantLock就介绍到这了,明天继续更文Lock相关知识

java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)相关推荐

  1. java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

    ===============>>#1 票数:41 已采纳 使用slf4j无法做到这slf4j . 我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映 ...

  2. java logger 日志级别_Java如何设置Logger日志级别?

    在此示例中,您将看到我们如何更改或设置Logger日志级别.日志级别将告诉您Logger将记录哪个特定的日志消息. Logger如果级别等于或高于级别,则仅记录日志消息Logger.例如,当级别设置L ...

  3. Java内部类手机专卖店_JAVA——内部类的那些事儿

    obj3.func(); //3.2 访问静态内部类的静态方法(通过类名访问) Outer.StaInner.staFunc(); //4 局部内部类访问局部变量 Outer obj4 = new O ...

  4. java让线程空转_Java锁:悲观/乐观/阻塞/自旋/公平锁/闭锁,锁消除CAS及synchronized的三种锁级别...

    JAVA LOCK 大全 [TOC] 一.广义分类:乐观锁/悲观锁 1.1 乐观锁的实现CAS (Compare and Swap) 乐观锁适合低并发的情况,在高并发的情况下由于自旋,性能甚至可能悲观 ...

  5. java 对变量加锁_Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁...

    乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...

  6. java重入锁_java并发编程:可重入锁是什么?

    释义 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁.ReentrantLock和sync ...

  7. java 锁的类型_Java锁的种类 - shawnplaying的个人页面 - OSCHINA - 中文开源技术交流社区...

    Java锁和并发需要结合在一块了理解,涉及到了多个话题. 本文主要参考了 http://ifeve.com/java_lock_see1/ 但是我认为原文中有某些错误,我在下面的代码中做了修改. 公平 ...

  8. 对 java 同步锁 以及 级别升级的 理解

    首先简单说下先偏向锁.轻量级锁.重量级锁三者各自的应用场景: 偏向锁:只有一个线程进入临界区: 轻量级锁:多个线程交替进入临界区: 重量级锁:多个线程同时进入临界区. 还要明确的是,偏向锁.轻量级锁都 ...

  9. java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁

    偏向锁 当锁对象第一次被线程获取时,虚拟机会把对象头的锁状态标志设置为01(即偏向状态),同时,使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中.如果这个CAS操作成功,那么 ...

最新文章

  1. 在线等:“实习拿到两个不太好的offer,去腾讯还是去阿里?”
  2. 深度学习arm cache系列--一篇就够了
  3. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
  4. 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS
  5. jpa onetoone_拥抱开源从表设计到 JPA 实现
  6. mix2线刷开发板救砖_小米Mix 2(安卓8.0)一键救砖教程,轻松刷回官方系统
  7. 精品软件 推荐 卡巴斯基安全软件 本人使用过的效果最好的杀毒软件之一哟...
  8. 我在阿里云玩蟹科技分享篇
  9. Java实现分类文件拷贝2
  10. iOS根据模型获取模型字段以及字段的类型(用于创建数据库的表)
  11. python大佬养成计划----Web框架(Flask)
  12. 云承软件和云溪哪个好_诺承木工开料机使用什么软件好
  13. linux dropbox自动同步,CentOS 6.x使用dropbox并定时同步数据
  14. 图扑软件数字孪生汽车生产线,赋能智慧工厂科学运维
  15. 基于U盘传播的简单病毒
  16. python生兔子问题(递归算法)_python 实现兔子生兔子示例
  17. 读《当众讲话诀窍》-殷亚敏 (2)
  18. Windows 10 卸载 Qt 5.9.9
  19. 视觉机器学习之--决策树学习 方差意义 Cnm的意思
  20. 为什么特征数据要做对数变换?

热门文章

  1. 解决Silverlight中DataGrid在显示数据时多一空白列
  2. WordPress 5.1:从CSRF到RCE
  3. 爬虫--BeautifulSoup使用
  4. BZOJ 1786 DP
  5. 转 html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
  6. Grunt 之通配符
  7. saltstack中grains简介
  8. 区分内边距与外边距padding和margin
  9. 你的密码安全吗?——索尼事件的教训
  10. 从经理的角度看领域设计