首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏码云大作战

    ReentrantLock

    ReentrantLock是 java提供代码层面的锁,和synchronized关键字相同。 为什么在用提供了 synchronized关键字后,还提供了ReentrantLock等代码层面的锁API,首先在synchronized关键字刚推出是,性能方面差很多,直到后面的版本中推出了锁升级的概念 分析 ReentrantLock 有如下几个特点: 1、互斥 2、重入 3、等待唤醒 4、存储一系列的等待线程 FIFO 先进先出 5、公平/非公平 使用案例 public class ReenTrantLockDemo 模拟优惠卷 private static List<Integer> array = new ArrayList<>(); private static Lock lock = new ReentrantLock public ReentrantLock(boolean fair) { sync = fair ?

    84240发布于 2020-08-26
  • 来自专栏Java工程师面试八股文

    ReentrantLock

    https://zhuanlan.zhihu.com/p/249147493 ReentrantLock底层使用了CAS+AQS队列实现 一、CAS 1、CAS(Compare and Swap) CAS 结构如下图所示: ​ 三、ReentrantLock的流程 首先ReentrantLock默认是非公平锁,也可以指定为公平锁 ReentrantLock的2个构造函数 public ReentrantLock () { sync = new NonfairSync(); //默认,非公平 } public ReentrantLock(boolean fair) { sync = fair new FairSync() : new NonfairSync(); //根据参数创建 } ①ReentrantLock先通过CAS尝试获取锁, ②如果此时锁已经被占用,该线程加入AQS队列并wait (state字段看做是每一个ReentrantLock的状态,若为0则不自由(被线程持有);否则自由) 若为0,表示锁未被占用。然后通过 !

    59000发布于 2021-02-12
  • 来自专栏互联网底层的我们

    话说 ReentrantLock

    ReentrantLock 一、 使用 1.1 简单使用 public class LockTest { // 新建锁 Lock lock = new ReentrantLock() 直到天荒地老 lock 的 tryLock 就像是一个渣男,轻轻尝试一下,不合适抓紧下一个 public class LockTest02 { // 新建锁 Lock lock = new ReentrantLock lockInterruptibly 可以被中断 在异常捕获里捕获异常 然后做一些后置处理 public class LockTest03 { // 新建锁 Lock lock = new ReentrantLock 这样对于后边排队的是不公平的 所以称为不公平锁 在ReentrantLock的实现中,不要脸的小强会尝试好几次,最后都失败的话他才会去队尾排队 Lock可以实现公平锁:公平锁就是lock的时候会先去排队队列里边看看 如果没有自己去申请锁,如果有自己去排队,去检查有没有人排队的时候可能会出现不公平(地铁一个人一大步窜你前边了),进队列的时候也可能会出现不公平(地铁一个人一大步窜你前边了) Lock lock = new ReentrantLock

    45000发布于 2021-04-05
  • 来自专栏网络收集

    ReentrantLock

    ReentrantLock 锁实现 Lock 接口,使用时需导入 import java.util.concurrent.locks.*;。实现功能和 synchronized 关键字类似。 但 synchronized 关键字是在 JVM 层面实现的,而 ReenTrantLock 是在 JDK 层面实现的。 public class ReentrantLockTest { // 创建锁对象 static Lock lock = new ReentrantLock(); public static public class ThreadDemo { // 创建锁对象 static Lock lock = new ReentrantLock(); public static void public class ThreadDemo { static ReentrantLock lock = new ReentrantLock(); static Condition condition

    39910编辑于 2022-08-06
  • 来自专栏小脑斧科技博客

    ReentrantLock 源码分析 -- ReentrantLock 的加锁与解锁

    ReentrantLock 与 AQS 独占锁 上一篇文章中,我们介绍了 ReentrantLock 的用法,他就是通过 AQS 来实现的,也是 AQS 独占模式的典型示例。 接下来我们就来看看 ReentrantLock 是如何实现的。 根据类图,我们可以看到 ReentrantLock 拥有三个内部类,分别是。 ReentrantLock 的加锁与解锁 上文中我们介绍过 ReentrantLock 的加锁与解锁方法,我们来看看他们究竟是怎么实现的。 2.1. Sync 与他的两个子类 根据类图,我们可以看到,ReentrantLock 拥有一个内部类 Sync,他是 AQS 的子类,同时,ReentrantLock 还拥有另外两个内部类 — FairSync

    42510编辑于 2022-06-27
  • 来自专栏XINDOO的专栏

    ReentrantLock源码解析

    谈到多线程,就不避开锁(Lock),jdk中已经为我们提供了好几种锁的实现,已经足以满足我们大部分的需求了,今天我们就来看下最常用的ReentrantLock的实现。 ,这篇文章先和你一起看下ReentrantLock,之后我们会再一起去了解ReentrantReadWriteLock和StampedLock,相信有了ReentrantLock的基础后面的内容也会容易理解很多 public ReentrantLock(boolean fair) { sync = fair ? ReentrantLock中最核心的就是Sync的实现,它默认已经实现了非公平锁的功能,所以你会看到NonfairSync只是简简单单继承了Sync而已。 ReentrantLock重写了tryRelease(),源码如下,也比较简单。

    49720发布于 2021-01-22
  • 来自专栏crossoverJie

    ReentrantLock 实现原理

    ReentrantLock 就是一个普通的类,它是基于 AQS(AbstractQueuedSynchronizer)来实现的。 锁类型 ReentrantLock 分为公平锁和非公平锁,可以通过构造方法来指定具体类型: //默认非公平锁 public ReentrantLock() { sync = new NonfairSync(); } //公平锁 public ReentrantLock(boolean fair) { sync = fair ? 获取锁 通常的使用方式如下: private ReentrantLock lock = new ReentrantLock(); public void run() { lock.lock 如果 state 大于 0 时,说明锁已经被获取了,则需要判断获取锁的线程是否为当前线程( ReentrantLock 支持重入),是则需要将 state+1,并将值更新。

    35420编辑于 2022-08-19
  • 来自专栏木木玲

    ReentrantLock 源码浅析

    ReentrantLock 介绍 一个可重入的互斥锁,它具有与使用{synchronized}方法和语句访问的隐式监视器锁相同的基本行为和语义,但它具有可扩展的能力。 ReentrantLock使用的是AQS的排他锁模式,由于AQS除了排他锁模式还有共享锁模式,本文仅对ReentrantLock涉及到的排他锁模式部分的内容进行介绍,关于共享锁模式的部分会在 CountDownLatch 源码分析 初始化 初始化 ———— 公平锁: ReentrantLock lock = new ReentrantLock(true) 初始化 ———— 非公平锁: ReentrantLock lock = new ReentrantLock() 或 ReentrantLock lock = new ReentrantLock(false) lock public void lock() { 本文主要围绕共享锁模式的介绍,就不对其进行展开了,关于排他锁的内容会在“ReentrantLock源码解析”一文中介绍。

    1.9K94发布于 2018-06-27
  • 来自专栏Java识堂

    ReentrantLock实现原理

    前言 建议和上一篇分享结合着看:深入理解AbstractQueuedSynchronizer 先举个例子,下面程序输出始终是5000,可以用ReentrantLock来保证线程安全 @ThreadSafe public class CountTest { public static int count = 0; public static Lock lock = new ReentrantLock 1 每解锁一次将status的个数减1,当stauts的值为0,其他线程可以获得锁 ReentrantLock只有一个成员变量Sync,Sync相当于一个代理类,具体的实现在子类中定义 private final Sync sync; ReentrantLock类有两个构造函数,默认是非公平锁。 当传入的参数是true时为公平锁,是false为非公平锁 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock

    57630发布于 2019-08-13
  • 来自专栏小小码农一个。

    了解ReentrantLock

    具体原理分析 在new ReetrantLock对象的时候,可以指定其支持公平锁还是非公平锁 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? ReentrantLock调用lock方法,最终会调用sync的tryAcquire函数,获取资源。 = Thread.currentThread()); } 非公平锁原理 NoFairSync同样继承Sync,ReentrantLock调用lock方法,最终会调用sync的tryAcquire函数,获取资源 请求独占资源时,可重入性的体现 ReentrantLock在申请资源的时候,都会判断当前持有独占资源的线程是不是当前线程,如果是的话,只是简单得将state值加1.记录当前线程的重入次数。

    66820发布于 2020-06-08
  • 来自专栏刘晓杰

    volatile,synchronized,ReentrantLock

    与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。 ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。 ReentrantLock提供了可轮询的锁请求。 ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。 注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。 ReentrantLock支持中断处理,且性能较synchronized会好些。

    62730发布于 2019-02-21
  • 来自专栏SpringBoot教程

    ReentrantLock、ReentrantReadWriteLock、StampedLock

    java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock java.util.concurrent.locks.ReentrantReadWriteLock; class MyResource { Map<String,String> map = new HashMap<>(); //=====ReentrantLock 等价于 =====synchronized Lock lock = new ReentrantLock(); //=====ReentrantReadWriteLock 一体两面,读写互斥

    53120编辑于 2023-02-16
  • 来自专栏小四的技术文章

    AQS之ReentrantLock

    ReentrantLock公平锁和非公平锁 ReentrantLock是一个独占锁,基于AQS实现,如果有线程获取了锁,那么其他线程来获取该锁的时候会被阻塞,ReentrantLock有两种 方式,一种是公平锁 可通过构造函数设置ReentrantLock的公平与非公平锁,默认为公平锁 public ReentrantLock() { sync = new NonfairSync(); } 构造函数为 new FairSync() : new NonfairSync(); } ReentrantLock原理 ReentrantLock是基于AQS来实现的,其核心是对state的处理,关于state, ReentrantLock使用 ReentrantLock只需要在需要同步的代码段进行加锁,需要用try来包裹代码,在finally里进行释放锁,关于它的其他方法,大家可以自行去看。 public class ReentrantLockTest { private final ReentrantLock lock = new ReentrantLock(); public

    31110编辑于 2022-07-26
  • 来自专栏Coder的技术之路

    并发-ReentrantLock浅析

    2.为了减小这种系统开销,我们想要吧加锁的行为从系统级别移到类上,于是有了Lock, 第一种就是ReentrantLock.ReentrantLock被叫做重入锁,意思是线程可以进入任何 一个它已经拥有的锁所同步着的代码块 当然,这个代表了广义上的可重入,ReentrantLock只能说是其中一种。 ReentrantLock的内核是AbstractQueuedSynchronizer,底层实现是CAS,如果抢 占成功,逻辑是比较简单的,如图 ? 当然,ReentrantLock 还涉及到很多其他知识点,比如公平锁和非公平锁、等待队列 如果添加、内部类AQS的模板模式等等,在这里只是做个记录,要想完全弄清楚,还是挺不容易的,有兴趣的同学们可以看看它的源代码探究一下

    27120发布于 2021-05-14
  • 来自专栏CSDN文章

    JUC-ReentrantLock

    AQS 学习ReentrantLock就不得不知道AQS,因为ReentrantLock就是基于了AQS对象的 特点 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态 而共享模式可以允许多个线程访问资源 提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList 条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet ReentrantLock 如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住 条件变量 synchronized 中也有条件变量,就是我们讲原理时那个 waitSet 休息室,当条件不满足时进入 waitSet 等待 ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的,这就好比 synchronized 是那些不满足条件的线程都在一间休息室等消息 而 ReentrantLock 支持多间休息室 ,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤 醒 原理 非公平锁实现原理 加锁流程 先看构造器,默认为非公平锁 public ReentrantLock() {

    32820编辑于 2023-10-17
  • 来自专栏崩天的勾玉

    ReentrantLock及AQS原理

    java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。 而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLockReentrantLock主要利用CAS+AQS队列来实现。它支持公平锁和非公平锁,两者的实现类似。 ReentrantLock原理 基本使用: private Lock lock = new ReentrantLock(); public void test(){ lock.lock(); ReentrantLock支持公平锁和非公平锁,并且ReentrantLock的底层就是由AQS来实现的。

    45030编辑于 2021-12-20
  • 来自专栏FunTester

    Java线程安全ReentrantLock

    我最近又学到了一个新技能ReentrantLock类,这个应该目前最简单的线程安全使用方式了,当然暴力synchronized除外。 ReentrantLock真的是一个非常好用的多线程安全工具类。 ReentrantLock核心(个人看法)有两个方法lock()和unlock(),顾名思义,一个是加锁一个是释放锁,所有线程安全的操作可以写在这两个方法之间。 下面演示一下ReentrantLock的基本使用,中间用到了- Java自定义异步功能实践、利用守护线程隐式关闭线程池中用到的异步关键字,有兴趣的可以翻一翻,就是关键字fun后面的代码块会有单独线程执行 public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); fun

    47320发布于 2021-11-12
  • 来自专栏Java进阶

    ReentrantLock 的实现原理

    AQS的功能可以分为独占和共享,ReentrantLock实现了独占功能。 ReentrantLock实现了Lock接口,加锁和解锁都需要显式写出,注意一定要在适当时候unlock。 ReentrantLock对比synchronized 和synchronized相比,ReentrantLock用起来会复杂一些。 ReentrantLock的优势在于它更灵活、更强大,增加了轮训、超时、中断等高级功能。 ReentrantLock的unlock方法很简单地调用了AQS的release: ? 和lock的tryAcquire一样,unlock的tryRelease同样由ReentrantLock实现: ?

    1K50发布于 2019-02-20
  • 来自专栏JavaEdge

    ReentrantLock 核心源码解析

    学习完 AQS,本文我们就来研究第一个 AQS 的实现类:ReentrantLock。 1 基本设计 ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。 建议的做法是始终立即在调用后使用try块进行锁定,最常见的是在构造之前/之后,例如: class X { private final ReentrantLock lock = new ReentrantLock 2 类架构 ReentrantLock 本身不继承 AQS,而是实现了 Lock 接口 [17221c2a2240fdcb? w=1294&h=1156&f=png&s=68806] 可见是ReentrantLock的抽象静态内部类 Sync 继承了 AbstractQueuedSynchronizer ,所以ReentrantLock

    41600发布于 2020-05-17
  • 来自专栏WriteOnRead

    JDK源码分析-ReentrantLock

    先看下 ReentrantLock 的类签名以及如何使用: public class ReentrantLock implements Lock, java.io.Serializable {} 典型用法 相比于 synchronized,其实 ReentrantLock 的出现并不重复,它增加了不少功能,下面先简单介绍几个概念。 ReentrantLock 和 synchronized 都是可重入锁。 代码分析 构造器 ReentrantLock 有两个构造器,分别如下: private final Sync sync; // 构造一个 ReentrantLock 实例(非公平锁) public ReentrantLock () { sync = new NonfairSync(); } // 构造一个 ReentrantLock 实例(指定是否公平) public ReentrantLock(boolean fair

    35210发布于 2019-08-16
领券