首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java的ReentrantLock究竟获得了什么锁?

Java的ReentrantLock是一个可重入的互斥锁,它获得了独占锁。

具体来说,ReentrantLock是Java.util.concurrent包中的一个类,它提供了与synchronized关键字类似的功能,但更加灵活和强大。ReentrantLock实现了Lock接口,通过lock()方法获取锁,通过unlock()方法释放锁。

ReentrantLock获得的是独占锁,也称为互斥锁。这意味着同一时刻只有一个线程可以持有该锁,其他线程必须等待锁的释放才能获取它。与synchronized关键字不同,ReentrantLock提供了更多的高级特性,如可重入性、公平性、条件变量等。

可重入性是指同一个线程可以多次获取同一个锁而不会产生死锁。当一个线程已经获得了ReentrantLock的锁时,它可以继续多次调用lock()方法而不会被阻塞,每次调用lock()方法都会增加锁的持有计数。只有当锁的持有计数为0时,其他线程才能获取该锁。

ReentrantLock的优势在于它提供了更高的灵活性和可控性。相比于synchronized关键字,ReentrantLock可以实现更细粒度的锁控制,可以灵活地选择公平性或非公平性,可以使用条件变量实现线程间的等待和通知机制。

ReentrantLock的应用场景包括多线程编程、并发控制、资源管理等。它可以用于保护共享资源的访问,避免多个线程同时修改共享数据导致的数据不一致性问题。在高并发的场景下,使用ReentrantLock可以提供更好的性能和可伸缩性。

腾讯云提供了与Java开发相关的云产品,如云服务器、云数据库、云存储等,可以满足Java开发者的需求。具体产品信息和介绍可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java重入ReentrantLock

简介 ReentrantLock重入,是实现Lock接口一个类,也是在实际编程中使用频率很高一个,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该再次获取不会被阻塞。...在java关键字synchronized隐式支持重入性。synchronized通过获取自增,释放自减方式实现重入。与此同时,ReentrantLock还支持公平和非公平两种方式。...公平和非公平 ReentrantLock支持两种:公平和非公平。何谓公平性,是针对获取而言,如果一个是公平,那么获取顺序就应该符合请求上绝对时间顺序,满足FIFO。...ReentrantLock构造方法无参时是构造非公平。...] 公平耗时:9 非公平结果: 只需将ReentrantLock构造中true去掉即是非公平

54730

java并发之重入-ReentrantLock

前言 目前主流有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized性能已经和重入不分伯仲了,但是重入功能和灵活性要比这个关键字多多...下面就来介绍这个重入。 正文 ReentrantLock重入是Lock接口里最重要实现,也是在实际开发中应用最多一个,我这篇文章更接近实际开发应用场景,为开发者提供直接上手应用。...ReentrantLock默认是非公平,因为:公平实现了先进先出公平性,但是由于来一个线程就加入队列中,往往都需要阻塞,再由阻塞变为运行,这种上下文切换是非常好性能。...二、加入之后lock方法到底是怎么处理(只讲非公平) 刚才我们说如果是非公平就调用NonfairSync方法,那我们就来看看这个方法都做来什么。...,没有得到会在队列里不停利用CAS原理试图得到,CAS很高效,也就是,为什么ReentrantLock比synchronized高效原因,缺点是很浪费cpu资源。

41230
  • Java 重入 ReentrantLock 原理分析

    是 ✅ 是否可尝试加锁 否 是 ❌ 是否是Java内置特性 是 否 ❌ 自动获取/释放 是 否 ❌ 对异常处理 自动释放 需手动释放 ❌ 除此之外,ReentrantLock 提供了丰富接口用于获取状态...不过我们也可通过 ReentrantLock 构造方法ReentrantLock(boolean fair)调整加锁模式。 既然既然有两种不同加锁模式,那么他们有什么优缺点呢?...这样情况时一种“双赢”局面:B 获得时刻并没有推迟,C 更早获得了,并且吞吐量也获得了提高。 上面的原因大家看懂了吗?...3.2.1 公平 公平对应逻辑是 ReentrantLock 内部静态类 FairSync,我们沿着上面的 lock 方法往下分析,如下: +--- ReentrantLock.FairSync.java...那么现在请大家思考一个问题:在代码差异不大情况下,是什么差异导致了公平和非公平产生呢?大家先思考一下,答案将会在下面展开说明。 在上面的源码对比图中,左边是非公平实现,右边是公平实现。

    1.4K252

    彻底理解Java并发:ReentrantLock

    本篇内容包括:为什么使用 Lock、Lock 注意事项、ReentrantLock 和 synchronized 对比、ReentrantLock (加锁、解锁、公平与非公平ReentrantLock...但是要注意以下几点 Lock 不是 Java 语言内置,synchronized 是 Java 语言关键字,因此是内置特性。...3、ReentrantLock 和 synchronized ReentrantLockjava.util.concurrent.locks 包中一个类,是独占,为最后一个执行 lock 操作成功且为释放线程拥有...ReenTrantLock 提供了一种能够中断等待线程机制。 ---- 二、ReentrantLock ReentrantLock,它是一个“可重入”什么是“可重入”?...ReentrantLock源码片段: public class ReentrantLock implements Lock, java.io.Serializable { private

    62110

    Java-ReentrantLock-公平源码分析

    本次准备分六篇文章用来分析基于AQS实现类 第一篇(Java-ReentrantLock-非公平源码分析) 第二篇(Java-ReentrantLock-公平源码分析) 第三篇(Java-并发工具...-CountDownLatch源码分析) 第四篇(Java-并发工具-Semaphore源码分析) 第五篇(Java-ReentrantReadWriteLock-读分析) 第六篇(Java-ReentrantReadWriteLock...-写分析) 介绍 本篇文章为系列文章第二篇,本篇文章介绍ReentrantLock(可重入)公平代码实现,ReentrantLock是一个可重入互斥Lock,它具有与使用synchronized...什么是可重入 可重入指的是线程可以重复获取同一把. 概述 首先,我们从总体过程入手,了解ReentrantLock公平执行逻辑,然后逐步深入分析源代码。...-公平获取和释放源码分析,公平实现也很简单,这些都因为它基于AQS实现,AQS已经帮我们实现了大多数功能,了解ReentrantLock源码实现能够让我们更加深入了解AQS设计思想。

    20310

    Java并发编程之重入(ReentrantLock)

    ReentrantLock是基于AQS独占模式实现独占,同时只能有一个线程能获取到该,获取不到线程将被放入该AQS阻塞队列中等待。...Thread-1获得了 Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.base/java.util.concurrent.locks.ReentrantLock...-4获得了 Thread-4获得了 Thread-3获得了 修改ReentrantLock创建方式,改为公平 ReentrantLock reentrantLock = new ReentrantLock...-0获得了 Thread-3获得了 Thread-4获得了 使用公平不会产生饥饿现象,由于要维护线程顺序,使公平效率低下,所以没特殊情况应该使用非公平。...参考资料: 《Java并发编程之美》 一文彻底理解ReentrantLock可重入使用

    62020

    Java显示ReentrantLock使用与原理

    } } } 复制代码 同样可以得到上述效果 显示功能 显示锁在java中通过接口Lock提供如下功能 image.png lock: 线程无法获取会进入休眠状态,直到获取成功...image.png Sync两个实现类,公平和非公平 公平会把权限给等待时间最长线程来执行,非公平则获取执行权限线程与线程本身等待时间无关 默认初始化ReentrantLock...对于JAVA,这种需要直接操作内存操作是通过unsafe来完成,具体实现机制则依赖于操作系统。...更新状态 return free; } 复制代码 从源码实现可以看到 ReentrantLock获取时,在已经被占有的情况下,如果占有线程是当前线程,那么允许重入,即再次占有,如果由其它线程占有...lock原理中acquireQueued区别在于park时间是有限,详见源码 AbstractQueuedSynchronizer.doAcquireNanos 为什么需要显示 内置功能上有一定局限性

    68920

    究竟什么是可重入

    经历 很久之前就听说了可重入,可重入究竟什么意思,以前是囫囵吞枣,只要记住ReentrantLock和sychronized是可重入就行了,爱咋用咋用,好吧,原谅我无知,最近对基础查漏补缺,...释义 广义上可重入指的是可重复可递归调用,在外层使用之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样就叫做可重入。...ReentrantLock和synchronized都是可重入,下面是一个用synchronized实现例子: public class ReentrantTest implements Runnable...看到一个经典讲解,使用自旋来模拟一个不可重入,代码如下: import java.util.concurrent.atomic.AtomicReference; public class UnreentrantLock...ReentrantLock中可重入实现 这里看非公平获取方法: final boolean nonfairTryAcquire(int acquires) {

    72120

    面试题-JAVA之重入ReentrantLock

    并发场景下如何保证线程安全,首先就会想到Synchronized,是的没错但是今天我们来看一下和syn锁具有相同作用而且扩展性更高ReentrantLock(重入),以下分析基于JDK1.8...一看作者,哇塞Doug Lea大神,一种崇拜油然而生,我们来看看大神在类注释上写了些什么 ? 可重入锁具有和Sync锁相同方法行为,但是更有扩展能力。 ?...构造方法中包含一个可选参数,如果是true则创建一个公平倾向于等待时间最长线程,如果为false则不能保证任何访问顺序,使用公平吞吐量较低,很少有饥饿。 ? 建议使用方式。...,只会state-1,然后返回false; 公平: FIFO,等待时间最长请求获取,也可以说是按顺序获取,这就是公平。...非公平:当前A持有,队列中BCDE,这时线程F想要获取,当A释放时候唤醒队列中B线程,这时B、F具有相同优先级,同时cas竞争。

    87030

    Java中可重入ReentrantLock原理剖析

    一、 概述 本文首先介绍Lock接口、ReentrantLock类层次结构以及功能模板类AbstractQueuedSynchronizer简单原理,然后通过分析ReentrantLocklock...在Java实现中ReentrantLock就是这样。另外一种,它可以允许多个线程读取资源,但是只能允许一个线程写入资源,ReadWriteLock就是这样一种特殊,简称读写。...然后进入CLH队列抢占模式,进入时候也会去执行一次获取操作,如果还是获取不到,就调用LockSupport.park将当前线程挂起。那么当前线程什么时候会被唤醒呢?...五、 总结 线程使用ReentrantLock获取分为两个阶段,第一个阶段是初次竞争,第二个阶段是基于CHL队列竞争。在初次竞争时候是否考虑队列节点直接区分出了公平和非公平。...总体来说,ReentrantLock是一个比较轻量级,而且使用面向对象思想去实现了功能,比原来synchronized关键字更加好理解。

    62720

    Java-ReentrantLock-非公平源码分析

    本次准备分六篇文章用来分析基于AQS实现类 第一篇(Java-ReentrantLock-非公平源码分析) 第二篇(Java-ReentrantLock-公平源码分析) 第三篇(Java-并发工具...-CountDownLatch源码分析) 第四篇(Java-并发工具-Semaphore源码分析) 第五篇(Java-ReentrantReadWriteLock-读分析) 第六篇(Java-ReentrantReadWriteLock...-写分析) 介绍 本篇文章为系列文章第一篇,本篇文章介绍ReentrantLock(可重入)非公平代码实现,ReentrantLock是一个可重入互斥Lock,它具有与使用synchronized...什么是可重入 可重入指的是线程可以重复获取同一把. 概述 首先,我们从总体过程入手,了解ReentrantLock非公平执行逻辑,然后逐步深入分析源代码。...,但是我们依然看见了资源优化,就是只有当前线程完全释放资源后,才会让AQS唤醒后续节点,这样避免频繁唤醒线程,减少竞争 总结 以上是ReentrantLock获取和释放源码分析,它实现其实很简单

    25420

    ReentrantLock底层原理

    类源码 先看ReentrantLock父子关系,它继承了lock,相应就要实现lock方法,下面看他是怎么实现 public class ReentrantLock implements Lock..., java.io.Serializable 实现lock方法,方法体内只有一行代码,调用了synclock方法,看一下这个sync是个什么 public void lock() { sync.lock...是怎么定义用是公平还是非公平,使用构造函数定义,源码如下 /** * Creates an instance of {@code ReentrantLock}...new FairSync() : new NonfairSync(); } 当我们new ReentrantLock()时候默认使用非公平,如果想用公平就传递参数true,如下 new...ReentrantLock(true) 上面都是ReentrantLock基本实现,那它是怎么控制,我们来看非公平lock内容 final void lock() { if (compareAndSetState

    23640

    Java高级上锁机制:显式 ReentrantLock

    Java 5.0 加入了新上锁工作:ReentrantLock,它和同步(Synchronized)方法内置不同,这是一种显式。...1 Lock和ReentrantLock Lock作为显式,其提供了一种无条件、可轮询和定时、可中断操作,其获得和释放操作都是显示。...在Java官方注解中,给出了这样代码示例: Lock l = new ReentrantLock(); l.lock(); try { // access the resource protected...线程间切换,涉及线程挂起和恢复等一系列操作,这样线程上下文切换很是消耗性能,所以要避免不必要线程切换。 Java 6中对内置进行了优化,现在内置和显式锁相比性能已经很接近,只略低一些。...为此,Java 5.0 中出现了读-写ReadWriteLock。

    62930

    轻松学习java可重入(ReentrantLock)实现原理

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源安全访问,兴许,你还用过Lock相关功能,但你可能从来没有想过java底层机制是怎么实现...如果真是这样,而且你有兴趣了解,今天我将带领你轻松学习下java中非常重要,也非常基础可重入-ReentrantLock实现机制。...java可重入-ReentrantLock实现细节 ReentrantLock支持两种获取方式,一种是公平模型,一种是非公平模型。在继续之前,咱们先把故事元素转换为程序元素。...答案当然是否定,否则就直接死锁了。当A再次请求,就相当于是打水期间,同一家人也来打水了,是有特权,这时候状态如下图所示: 到了这里,相信大家应该明白了什么是可重入了吧。...结束语 可重入实现会涉及到CAS,AQS,java内存可见性(volatile)等知识,为了避免大家直接被代码搞晕,故而想以最简单方式把可重入进行抽象,讲明白其中实现原理,这样看起源码也有个借鉴思路

    29310

    ReentrantLock非公平与公平实现

    ReentrantLock非公平与公平实现 在文章开始之前,大家复习一遍分类: ReentrantLock是根据传入参数来决定是否使用公平,默认使用非公平: 公平/非公平 当多个线程来取时候...,按照规则排队等即为公平,不按照规则排队即为非公平, Synchronized就是一个典型非公平,而ReentrantLock 是根据AQS来实现线程一个调度达到公平与非公平一个切换...偏向/轻量级/重量级 自旋 自旋是采用让当前线程不停地在循环体内执行实现,当循环条件被其他线程改变时 才能进入临界区 可以参考:http://ifeve.com/java_lock_see1.../ 大家说到ReentrantLock这个,一般情况下第一个想法是它是一个可冲入,但是我认为另一个概念公平和非公平实现更能体现出它内涵: //使用默认非公平ReentrantLock nonFairReentrantLock...总结:ReentrantLock通过构造参数fair来判断是创建公平还是非公平,底层中独享实现以及队列等待功能依赖于AQS, AQS是java中大部分基础,其中可以划分独享和共享,根据volatile

    1.3K10

    深入解析ReentrantLock重入Java多线程中利器

    Java多线程编程中,是一项关键技术,用于保护共享资源,确保线程安全。...ReentrantLock(可重入)是Java中强大而灵活机制之一,本文将深入解析ReentrantLock原理和使用方法。...为了解决这些问题,Java提供了多种机制,其中ReentrantLock是一种强大选择。...ReentrantLock基本概念ReentrantLockJava.util.concurrent包中一部分,是一种可重入独占。可重入意味着同一个线程可以多次获取同一把而不会造成死锁。...结语ReentrantLockJava多线程编程中非常强大机制,它提供了可重入性、公平性、条件变量等丰富特性,适用于各种复杂同步需求。

    44250
    领券