首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

话说 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

30500

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.7K94

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

20510

JUC-ReentrantLock

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

12920

并发-ReentrantLock浅析

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

21520

话说 ReentrantLock_源码

之前文章写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

27300
领券