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 ?
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
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 与 AQS 独占锁 上一篇文章中,我们介绍了 ReentrantLock 的用法,他就是通过 AQS 来实现的,也是 AQS 独占模式的典型示例。...接下来我们就来看看 ReentrantLock 是如何实现的。 根据类图,我们可以看到 ReentrantLock 拥有三个内部类,分别是。...ReentrantLock 的加锁与解锁 上文中我们介绍过 ReentrantLock 的加锁与解锁方法,我们来看看他们究竟是怎么实现的。 2.1....Sync 与他的两个子类 根据类图,我们可以看到,ReentrantLock 拥有一个内部类 Sync,他是 AQS 的子类,同时,ReentrantLock 还拥有另外两个内部类 — FairSync
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
与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。...ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。...ReentrantLock提供了可轮询的锁请求。...ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。...注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。 ReentrantLock支持中断处理,且性能较synchronized会好些。
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 一体两面,读写互斥
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的模板模式等等,在这里只是做个记录,要想完全弄清楚,还是挺不容易的,有兴趣的同学们可以看看它的源代码探究一下
具体原理分析 在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.记录当前线程的重入次数。
谈到多线程,就不避开锁(Lock),jdk中已经为我们提供了好几种锁的实现,已经足以满足我们大部分的需求了,今天我们就来看下最常用的ReentrantLock的实现。...,这篇文章先和你一起看下ReentrantLock,之后我们会再一起去了解ReentrantReadWriteLock和StampedLock,相信有了ReentrantLock的基础后面的内容也会容易理解很多...public ReentrantLock(boolean fair) { sync = fair ?...ReentrantLock中最核心的就是Sync的实现,它默认已经实现了非公平锁的功能,所以你会看到NonfairSync只是简简单单继承了Sync而已。...ReentrantLock重写了tryRelease(),源码如下,也比较简单。
ReentrantLock是java concurrent包提供的一种锁实现。不同于synchronized,ReentrantLock是从代码层面实现同步的。...图1 reentrantLock的类层次结构图 Lock定义了锁的接口规范。 ReentrantLock实现了Lock接口。...ReentrantLock的方法都依赖于AbstractQueuedSynchronizer的实现。...public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair...ReentrantLock继承AQS完全从代码层面实现了java的同步机制,相对于synchronized,更容易实现对各类锁的扩展。
之前文章写AQS的时候有说过公平锁的代码 这里以非公平锁来看一下 面试的时候设计模式:模板方法 在AQS里体现的淋漓尽致 ,你要是从设计模式扯到这里,然后你正好又看过AQS在ReentrantLock中的实现...,那你就可以让面试官眼前一亮 Lock lock = new ReentrantLock(false); lock.lock(); /** * 申请锁 * * ...* 如果锁被其他线程持有,当前线程对于调度就不可用,然后睡着, 直到获取锁,然后把锁持有数改为1 */ // ReentrantLock.class public void lock...就后边排队吧 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } // ReentrantLock.class...protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } // ReentrantLock.class
在Java中,java.util.concurrent.locks.ReentrantLock是一个常用的公平锁实现。...{ private final ReentrantLock lock = new ReentrantLock(); // 创建一个非公平锁 public void lock...三、ReentrantLock 3.1 ReentrantLock 加锁和解锁的过程 加锁:当线程CAS获取锁失败,将当前线程入队列,把前驱节点状态设置为SIGNAL状态,并将自己挂起。...AQS和ReentrantLock为Java并发编程提供了强大的支持。 AQS作为同步器的基石,通过提供一个简单的框架和机制,使得各种同步器(如ReentrantLock)的实现变得相对简单和一致。...在选择使用AQS和ReentrantLock时,需要根据具体的应用场景和需求进行权衡。
ReentrantLock 类实现了 Lock ,它拥有与synchronized 相同的并发性和内存语义,但是添加了类似轮询锁、定时锁等候和可中断锁等候的一些特性。...除此之外,与目前的 synchronized 实现相比,争用下的 ReentrantLock 实现更具可伸缩性。(在未来的 JVM 版本中,synchronized 的争用性能很有可能会获得提高。)...这意味着当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多。
“ 上一篇文章分析了锁框架的AQS的源码,今天我们来分析一种具体的锁:重入锁ReentrantLock的源码,前面我们也说到ReentrantLock内部最重要的实现是基于AQS做的” ?...在分析重入锁代码之前,我们需要先知道重入锁ReentrantLock分为公平锁和非公平锁(通过构造函数创建不同的锁),它的内部基于AQS实现抽象类Sync同步器(在AQS文章中我们谈论过)。...01 — 首先我们看一下ReentrantLock的内部抽象类Sync。...Sync在ReentrantLock中承担着基石的作用,在它的内部实现一系列的方法用于ReentrantLock定义公平锁和非公锁,代码中注释关于Sync说的很清楚了(自认为)。...下面我们再来看一下ReentrantLock的方法: 首先是它的两个构造方法 //无参构造方法,默认非公平锁 public ReentrantLock() { sync =
领取专属 10元无门槛券
手把手带您无忧上云