ReentrantLock是 java提供代码层面的锁,和synchronized关键字相同。...为什么在用提供了 synchronized关键字后,还提供了ReentrantLock等代码层面的锁API,首先在synchronized关键字刚推出是,性能方面差很多,直到后面的版本中推出了锁升级的概念...分析 ReentrantLock 有如下几个特点: 1、互斥 2、重入 3、等待唤醒 4、存储一系列的等待线程 FIFO 先进先出 5、公平/非公平 使用案例 public class ReenTrantLockDemo...模拟优惠卷 private static List array = new ArrayList(); private static Lock lock = new ReentrantLock...public ReentrantLock(boolean fair) { sync = fair ?
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,表示锁未被占用。然后通过 !
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
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
ReentrantLock 与 AQS 独占锁 上一篇文章中,我们介绍了 ReentrantLock 的用法,他就是通过 AQS 来实现的,也是 AQS 独占模式的典型示例。...接下来我们就来看看 ReentrantLock 是如何实现的。 根据类图,我们可以看到 ReentrantLock 拥有三个内部类,分别是。...ReentrantLock 的加锁与解锁 上文中我们介绍过 ReentrantLock 的加锁与解锁方法,我们来看看他们究竟是怎么实现的。 2.1....Sync 与他的两个子类 根据类图,我们可以看到,ReentrantLock 拥有一个内部类 Sync,他是 AQS 的子类,同时,ReentrantLock 还拥有另外两个内部类 — FairSync
具体原理分析 在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.记录当前线程的重入次数。
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源码解析”一文中介绍。
而 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,并将值更新。
前言 建议和上一篇分享结合着看:深入理解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
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
java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock...java.util.concurrent.locks.ReentrantReadWriteLock; class MyResource { Map map = new HashMap(); //=====ReentrantLock...等价于 =====synchronized Lock lock = new ReentrantLock(); //=====ReentrantReadWriteLock 一体两面,读写互斥
与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。...ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。...ReentrantLock提供了可轮询的锁请求。...ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。...注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。 ReentrantLock支持中断处理,且性能较synchronized会好些。
AQS 学习ReentrantLock就不得不知道AQS,因为ReentrantLock就是基于了AQS对象的 特点 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态...而共享模式可以允许多个线程访问资源 提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList 条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet ReentrantLock...如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住 条件变量 synchronized 中也有条件变量,就是我们讲原理时那个 waitSet 休息室,当条件不满足时进入 waitSet 等待 ReentrantLock...的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的,这就好比 synchronized 是那些不满足条件的线程都在一间休息室等消息 而 ReentrantLock 支持多间休息室...,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤 醒 原理 非公平锁实现原理 加锁流程 先看构造器,默认为非公平锁 public ReentrantLock() {
2.为了减小这种系统开销,我们想要吧加锁的行为从系统级别移到类上,于是有了Lock, 第一种就是ReentrantLock.ReentrantLock被叫做重入锁,意思是线程可以进入任何 一个它已经拥有的锁所同步着的代码块...当然,这个代表了广义上的可重入,ReentrantLock只能说是其中一种。...ReentrantLock的内核是AbstractQueuedSynchronizer,底层实现是CAS,如果抢 占成功,逻辑是比较简单的,如图 ?...当然,ReentrantLock 还涉及到很多其他知识点,比如公平锁和非公平锁、等待队列 如果添加、内部类AQS的模板模式等等,在这里只是做个记录,要想完全弄清楚,还是挺不容易的,有兴趣的同学们可以看看它的源代码探究一下
谈到多线程,就不避开锁(Lock),jdk中已经为我们提供了好几种锁的实现,已经足以满足我们大部分的需求了,今天我们就来看下最常用的ReentrantLock的实现。...,这篇文章先和你一起看下ReentrantLock,之后我们会再一起去了解ReentrantReadWriteLock和StampedLock,相信有了ReentrantLock的基础后面的内容也会容易理解很多...public ReentrantLock(boolean fair) { sync = fair ?...ReentrantLock中最核心的就是Sync的实现,它默认已经实现了非公平锁的功能,所以你会看到NonfairSync只是简简单单继承了Sync而已。...ReentrantLock重写了tryRelease(),源码如下,也比较简单。
IDEA 注册码,2020.2 IDEA 激活码 ReentrantLock 锁详解 ReentrantLock 支持公平锁和非公平锁,可重入锁 ReentrantLock的底层是通过 **AQS[...【2】ReentrantLock 的核心是 AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。 【3】ReentrantLock 是如何实现公平锁的?...【4】ReentrantLock 是如何实现非公平锁的? 【5】ReentrantLock 默认实现的是公平还是非公平锁? 【6】使用ReentrantLock 实现公平和非公平锁的示例?...八、AQS应用 ---- **ReentrantLock的可重入应用:**ReentrantLock的可重入性是 AQS很好的应用之一,在了解完上述知识点以后,我们很容易得知ReentrantLock实现可重入的方法...由于篇幅原因,本文仅介绍了可重入锁ReentrantLock的原理和AQS原理,希望能够成为大家了解AQS和ReentrantLock等同步器的“敲门砖”。
static void main(String[] args) { test1(); } public static void test1() { Lock lock = new ReentrantLock...= null) LockSupport.unpark(s.thread); } 手写 ReentrantLock伪代码 通过上面分析,我们可以得到 RReentrantLock
ReentrantLock的源码分析可以帮助我们更好地理解其内部实现和工作原理。...ReentrantLock内部通过AQS维护着一个等待队列,来管理获取锁的线程。...锁在ReentrantLock中,还涉及到锁的重入性、公平性等问题,这些都是通过AQS框架来实现的。...final ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { Thread...这个示例展示了ReentrantLock的基本用法,以及如何在多线程环境下确保线程安全。希望这个示例能够帮助您更好地理解ReentrantLock的源码实现。
初步查看ReentrantLock,我们发现其中有抽象类Sync,已经Sync的两种不同实现方式,其中NonfairSync是非公平锁,FairSync是公平锁,Sync继承了AbstractQueuedSynchronizer
虽然时至今日,优化后的 synchronized 锁的性能已经与 ReentrantLock 接近,但 ReentrantLock 仍然具备着 synchronized 所不具备的很多优势: 1....支持条件变量 因此,在高度竞争的并发环境下,以及较为复杂的使用场景中,ReentrantLock 都是 synchronized 的有力替代品。...本文,我们就来介绍一下 ReentrantLock 的用法,下一篇文章中,我们详细的剖开源码解析 ReentrantLock 的实现原理。 2....ReentrantLock 的基本使用 — 加锁和解锁 ReentrantLock 类提供了最基本的加锁和解锁方法: public void lock(); public void unlock();...class Counter { private static int counter = 0; private static ReentrantLock lock = new ReentrantLock
领取专属 10元无门槛券
手把手带您无忧上云