`

通过AQS实现一个互斥锁

阅读更多

 

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();
        }

    }

}

 

0
0
分享到:
评论

相关推荐

    aqs_demo.rar

    aqs同步器&redisson锁

    Java并发编程:用AQS写一把可重入锁

    AQS是J.U.C包下AbstractQueuedSynchronizer抽象的队列式的同步器的简称,这是一个抽象类,它定义了一套多线程访问共享资源的同步器框架,J.U.C包下的许多同步类实现都依赖于它,比如ReentrantLock/Semaphore/...

    Java volatile与AQS锁内存可见性

    从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性

    面试必问之AQS原理详解.pdf

    简单来说 AQS 会把所有的请求线程构成一个 CLH 队列,当一个线程执行完毕 (lock.unlock())时会激活自己的后继节点,但正在执行的线程并不在队列中, 而那些等待执行的线程全部处于阻塞状态,经过调查线程的显式...

    java并发编程:juc、aqs

    通过继承 AQS,可以实现不同的同步机制,如独占锁、共享锁等。 高效的等待队列: AQS 内部维护了一个等待队列,用于管理等待锁的线程。这个队列的实现基于链表,可以高效地管理大量的等待线程,实现线程的排队和唤醒...

    AQS流程图.html

    java锁AQS基础逻辑

    从锁的介绍,到java锁(lock、synchronor、aqs)到分布式锁 redis、zk、数据库的悲观锁和乐观锁

    当前的PPT总共56页,从锁的介绍,到java锁(lock、synchronor、aqs)到分布式锁 redis、zk、数据库的悲观锁和乐观锁都有涉及,算是比较完整的一个PPT,适合涉及到锁相关的专题讲座,以及自学的PPT,后面有机会会开...

    JUC核心类AQS的底层原理

    详细阐述了ReentrantLock通过AQS获取锁到释放锁的过程,附有关键方法的源码及注释

    JUC(一)-AQS源码分析

    AQS源码分析一、锁的介绍1.1 乐观锁/悲观锁1.2 共享锁/独占锁1.3 公平锁/非公平锁1.4 小结二、AQS框架结构介绍2.1 类图2.2 AQS数据结构三、源码详解3.1 acquire源码详解3.2 release源码详解四、从ReentranLock看公平...

    AQS源码分析 (1).pdf

    java锁底层实现,AQS源码分析。我在公司内部分享写的,如果想进一步了解,可以私聊

    java中的锁.xmind

    3.同步器是面向锁的实现者,他简化了锁的实现方式,屏蔽了同步状态管理、线程排队、等待和唤醒等底层操作 4.同步器的设计是基于设计模式为:模板方法模式 AQS实现细节: 1.同步器依赖内部的同步队列-FIFO双向队列来...

    一文带你看懂Java中的Lock锁底层AQS到底是如何实现的.doc

    一文带你看懂Java中的Lock锁底层AQS到底是如何实现的.doc

    JUC AQS的加解锁.pdf

    本资源描述了Java并发常见的问题AQS的加锁解锁的过程

    Java并发之AQS详解.pdf

    Java并发之AQS详解.pdf

    最新AQS资料整理.pdf

    最新AQS资料整理,里面知识涉及到AQS所遇到的所有问题,还有视频可以观看,可以帮助大家解惑,可以轻松应对职场问题

    juc aqs java

    juc 的aqs介绍。

    AQS流程图ReentranLock.vsdx

    AQS流程图ReentranLock.vsdx

    并发锁核心类AQS学习笔记

    AQS 是 AbstractQueuedSynchronizer 的简称,AQS 是一个抽象的队列式同步器框架,提供了阻塞锁和 FIFO 队列实现同步操作。JUC 包中的同步类基本都是基于 AQS 同步器来实现的,如 ReentrantLock,Semaphore 等。 二、...

    JDK_AQS解析

    解析AbstractQueuedSynchronizer这个类中,锁的获取、释放的相关逻辑。

Global site tag (gtag.js) - Google Analytics