import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; /** * 通过AQS实现的互斥锁 * <br/> * AQS: 用来构建锁或者其他同步组件的框架。它使用了一个int变量表示同步状态(更改状态使用CAS方式),通过内置的FIFO队列来完成资源获取线程的排队工作。 * * 通过AQS实现自定义的同步组件一般步骤: * 0.继承AQS,然后根据实现同步的模式,覆写对应的方法。这些方法可以是独占的方式、共享的方式 * 1.实现AQS的类需要调用compareAndSetState(),getState(),setState() 来进行状态的控制 * 2.外部的同步组件类,实现Lock接口,然后通过AQS对应的模板方法区实现lock方法。 * Created by Administrator on 2018/8/27. */ public class MutexLock implements Lock { private static final int LOCK = 1; private static final int UNLOCK = 0; private final Sync sync = new Sync(); @Override public void lock() { sync.acquire(LOCK); } @Override public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(LOCK); } @Override public boolean tryLock() { return sync.tryAcquire(LOCK); } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return false; } @Override public void unlock() { sync.release(UNLOCK); } @Override public Condition newCondition() { return sync.newCondition(); } public boolean isLock() { return sync.isHeldExclusively(); } /** * 一般同步器都使用静态内部类去控制外部类的状态 */ private static class Sync extends AbstractQueuedSynchronizer { /** * 独占模式 * * */ // 获取锁 @Override protected boolean tryAcquire(int arg) { if (compareAndSetState(UNLOCK, LOCK)) { //状态为0的时候获取锁 setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } //释放锁 @Override protected boolean tryRelease(int arg) { if (getState() == UNLOCK) throw new IllegalMonitorStateException(); setExclusiveOwnerThread(null); setState(UNLOCK); return true; } //锁是否被占用 @Override protected boolean isHeldExclusively() { return getState() == LOCK; } /* //共享模式 @Override protected int tryAcquireShared(int arg) { return super.tryAcquireShared(arg); } @Override protected boolean tryReleaseShared(int arg) { return super.tryReleaseShared(arg); }*/ final ConditionObject newCondition() { return new ConditionObject(); } } }
相关推荐
aqs同步器&redisson锁
AQS是J.U.C包下AbstractQueuedSynchronizer抽象的队列式的同步器的简称,这是一个抽象类,它定义了一套多线程访问共享资源的同步器框架,J.U.C包下的许多同步类实现都依赖于它,比如ReentrantLock/Semaphore/...
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
简单来说 AQS 会把所有的请求线程构成一个 CLH 队列,当一个线程执行完毕 (lock.unlock())时会激活自己的后继节点,但正在执行的线程并不在队列中, 而那些等待执行的线程全部处于阻塞状态,经过调查线程的显式...
通过继承 AQS,可以实现不同的同步机制,如独占锁、共享锁等。 高效的等待队列: AQS 内部维护了一个等待队列,用于管理等待锁的线程。这个队列的实现基于链表,可以高效地管理大量的等待线程,实现线程的排队和唤醒...
java锁AQS基础逻辑
当前的PPT总共56页,从锁的介绍,到java锁(lock、synchronor、aqs)到分布式锁 redis、zk、数据库的悲观锁和乐观锁都有涉及,算是比较完整的一个PPT,适合涉及到锁相关的专题讲座,以及自学的PPT,后面有机会会开...
详细阐述了ReentrantLock通过AQS获取锁到释放锁的过程,附有关键方法的源码及注释
AQS源码分析一、锁的介绍1.1 乐观锁/悲观锁1.2 共享锁/独占锁1.3 公平锁/非公平锁1.4 小结二、AQS框架结构介绍2.1 类图2.2 AQS数据结构三、源码详解3.1 acquire源码详解3.2 release源码详解四、从ReentranLock看公平...
java锁底层实现,AQS源码分析。我在公司内部分享写的,如果想进一步了解,可以私聊
3.同步器是面向锁的实现者,他简化了锁的实现方式,屏蔽了同步状态管理、线程排队、等待和唤醒等底层操作 4.同步器的设计是基于设计模式为:模板方法模式 AQS实现细节: 1.同步器依赖内部的同步队列-FIFO双向队列来...
一文带你看懂Java中的Lock锁底层AQS到底是如何实现的.doc
本资源描述了Java并发常见的问题AQS的加锁解锁的过程
Java并发之AQS详解.pdf
最新AQS资料整理,里面知识涉及到AQS所遇到的所有问题,还有视频可以观看,可以帮助大家解惑,可以轻松应对职场问题
juc 的aqs介绍。
AQS流程图ReentranLock.vsdx
AQS 是 AbstractQueuedSynchronizer 的简称,AQS 是一个抽象的队列式同步器框架,提供了阻塞锁和 FIFO 队列实现同步操作。JUC 包中的同步类基本都是基于 AQS 同步器来实现的,如 ReentrantLock,Semaphore 等。 二、...
解析AbstractQueuedSynchronizer这个类中,锁的获取、释放的相关逻辑。