并发编程--AbstractQueuedSynchronizer介绍和原理分析

Posted 归田

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程--AbstractQueuedSynchronizer介绍和原理分析相关的知识,希望对你有一定的参考价值。

AbstractQueuedSynchronizer是并发编程包中最重要的类,是并发编程包的实现基层。简单来说,AbstractQueuedSynchronizer提供了一个基于FIFO的队列,用于存储处于阻塞状态的线程;提供了一个volatile修改的state变量,用于作为锁获取的标识位,对于FIFO队列和state的操作都是通过Unsafe这个类来实现CAS原子操作。

AQS的功能可以分为两类:独占功能和共享功能,它的所有子类中,要么实现了并使用了它独占锁功能的API,要么使用了共享锁的功能,而不会同时使用两套API,即便是它最有名的子类读写锁ReentrantReadWriteLock也是通过两个内部类:读锁和写锁,分别实现两套API来实现的。

一、FIFO队列:

	//阻塞线程节点
    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;  //表示当前节点在等待Condition
 
        static final int PROPAGATE = -3;  //表示当前场景下后续的acquireShared能够得以执行

        volatile int waitStatus;

        volatile Node prev;

        volatile Node next;

       
        volatile Thread thread;

        Node nextWaiter;
	}
当线程没有竞争到锁资源时就会被阻塞并放到FIFO队列中,当锁资源释放后再从FIFO由阻塞状态变为可执行状态来获取锁资源并执行。当线程获取锁资源时有公平锁和非公平锁可以参考 并发编程--公平锁和非公平锁;此外对于锁的分类还有独占锁和共享锁,简单来说独占锁state就是当前锁只能有一个线程获取,其他线程处于阻塞状态,共享锁是多个线程可以同时持有当前锁状态state,只要符合某种要求所有线程可以并发执行,不用进行阻塞等待。

AQS FIFO队列模型:



以上是关于并发编程--AbstractQueuedSynchronizer介绍和原理分析的主要内容,如果未能解决你的问题,请参考以下文章

Go语言学习之旅--并发编程

Go语言学习之旅--并发编程

并发编程路线

java并发编程看啥书比较好

JAVA并发编程:并发编程的认识

并发编程的基础