ReentrantLock是如何基于AQS实现的】的更多相关文章

ReentrantLock是一个可重入的互斥锁,基于AQS实现,它具有与使用 synchronized 方法和语句相同的一些基本行为和语义,但功能更强大. lock和unlock ReentrantLock 中进行同步操作都是从lock方法开始.lock获取锁,进行一系列的业务操作,结束后使用unlock释放锁. private final ReentrantLock lock = new ReentrantLock(); public void sync(){ lock.lock(); try…
ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS: AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类实现的核心 其实简单来说AQS有两个核心,一个是volatile修饰的int类型state,这个是记录处于等待中需要持有锁和正在持有锁的线程数量 /** * The synchronization state. */ private volatile int state; 第二个就是Node内部类,…
一.了解什么是AQS 原文链接:http://www.studyshare.cn/blog-front/blog/details/1131 AQS是AbstractQueuedSynchronizer (抽象队列同步器)的简称,java中近一半的显示锁是基于AQS实现的.例如:ReentrantLock(独占锁).Semaphore(信号量).ReentrantReadWriteLock(读写锁).CountDownLatch(并发工具类).ThreadPoolExecutor(线程池) AQS…
本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解的 CountDownLatch 作用 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他一个或者多个线程的操作执行完后再执行. 单词Latch的中文翻译是门闩,也就是有"门锁"的功能,所以当门没有打开时,N个人是不能进入屋内的,也就是N个线程是不能继续往…
前言: 如果说J.U.C包下的核心是什么?那我想答案只有一个就是AQS.那么AQS是什么呢?接下来让我们一起揭开AQS的神秘面纱 AQS是什么? AQS是AbstractQueuedSynchronizer的简称.为什么说它是核心呢?是因为它提供了一个基于FIFO的队列和state变量来构建锁和其他同步装置的基础框架.下面是其底层的数据结构. AQS的特点 1.其内使用Node实现FIFO(FirstInFirstOut)队列.可用于构建锁或者其他同步装置的基础框架 2.且利用了一个int类表示…
10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多久能搞好? 我:就是一个工具类是吧,嗯今天下午就给你吧 老板:嗯,那你抓紧时间搞吧,大家都等着用呢 我:哦好的 先写个框架 关于锁,我还算有一个模糊的认识的,要让使用者可以获取锁.释放锁,来实现多线程访问时的安全性.于是我赶紧先把一个框架写了出来. // 给帅气老板用的锁 public class…
一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock.ReentrantLock并不是一种替代内置加锁的方法,而是作为一种可选择的高级功能.ReentrantLock实现了Lock接口,提供了一种无条件的.可轮询的.定时的以及可中断的锁获取操作,所有加锁和解锁方法都是显式的. 我们基本不会直接使用AQS,AQS是一个构建锁和同步器的框架,…
在看canal源码时发现一个有趣的锁实现--BooleanMutex 这个锁在canal里面多处用到,相当于一个开关,比如系统初始化/授权控制,没权限时阻塞等待,有权限时所有线程都可以快速通过 先看它的核心基于AQS的锁实现: private final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 2559471934544126329L; /** Sta…
锁分为独占锁和共享锁,它们的主要实现都是依靠AbstractQueuedSynchronizer,这个类只提供一系列公共的方法,让子类来调用.基于我了解不深,从这个类的属性,方法,和独占锁的获取方式去了解这个类. AbstractQueuedSynchronizer的主要属性和方法: 属性/方法 含    义 Thread exclusiveOwnerThread 这个是AQS父类AbstractOwnableSynchronizer的属性,表示独占模式同步器的当前拥有者 Node 上面已经介绍…
前面说了这个多,我们可以自己尝试实现一个同步器,我们可以简单的参考一下ReentrantLock这个类的实现方式,我们就简单的实现一个不可重入的独占锁吧! 一.简单分析ReentrantLock的结构 下图所示,直接实现了Lock这个接口,然后定义了一个内部类继承AQS,暂时不考虑公平锁和非公平锁,前面说AQS的时候说过,留有tryAcquire,tryRelease这两个方法在具体子类中根据实际情况实现的,可想而知这个内部类主要的是实现tryAcquire,tryRelease: 我们看看Lo…