码迷,mamicode.com
首页 > 其他好文 > 详细

同步器AQS解析

时间:2018-01-07 17:30:07      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:dwr   stat   bsp   extend   线程并发   获取   void   transient   cell   

什么是同步器?

  多线程并发执行,通过某种共享状态来同步,当共享状态满足某种条件,才能触发线程开始执行操作。

 

AbstractQueuedSynchronizer(AQS)

  这是一个抽象类,它提供多线程下不同共享模式的操作,实现它可以自定义同步器。

技术分享图片

可以看出,ReentrantLock和ReentrantReadWriteLock的内部类都是继承于这个抽象类。

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {

    private static final long serialVersionUID = 7270805090050340580L;
    // 底层操作
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    // 线程节点
    static final class Node {
        static final Node SHARED = new Node();
        static final Node EXCLUSIVE = null;
        static final int CANCELLED =  1;
        static final int SIGNAL    = -1;
        static final int CONDITION = -2;
        static final int PROPAGATE = -3;
        volatile int waitStatus;
        volatile Node prev;
        volatile Node next;
        volatile Thread thread;
        Node nextWaiter;
        
        final boolean isShared() {
            return nextWaiter == SHARED;
        }

        final Node predecessor() throws NullPointerException {
            Node p = prev;
            if (p == null)
                throw new NullPointerException();
            else
                return p;
        }

        Node() {
        }

        Node(Thread thread, Node mode) {
            this.nextWaiter = mode;
            this.thread = thread;
        }

        Node(Thread thread, int waitStatus) {
            this.waitStatus = waitStatus;
            this.thread = thread;
        }
    }
    // 头结点
    private transient volatile Node head;
    // 尾节点
    private transient volatile Node tail;
    // 共享状态
    private volatile int state;
    // 独占锁获取
    protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }
    // 独占锁释放
    protected boolean tryRelease(int arg) {
        throw new UnsupportedOperationException();
    }
    // 共享锁获取
    protected int tryAcquireShared(int arg) {
        throw new UnsupportedOperationException();
    }
    // 共享锁释放
    protected boolean tryReleaseShared(int arg) {
        throw new UnsupportedOperationException();
    }
    // 快速判断被线程独占
    protected boolean isHeldExclusively() {
        throw new UnsupportedOperationException();
    }
    // 获取同步状态
    protected final int getState() {
        return state;
    }
    // 设置同步状态
    protected final void setState(int newState) {
        state = newState;
    }
    // 原子操作同步状态
    protected final boolean compareAndSetState(int expect, int update) {
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }
    // 其他方法...
}

以上就是AQS里关键的几个需要重写的方法,这里没有将方法定义为abstract,而是方法只抛出一个异常,这是因为AQS有很多方法可以重写,而又不是每个都需要,所以就没有写成abstract。

同步器AQS解析

标签:dwr   stat   bsp   extend   线程并发   获取   void   transient   cell   

原文地址:https://www.cnblogs.com/huanStephen/p/8228105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!