站长网 资讯 JUC理解-AQS抽象队列同步器

JUC理解-AQS抽象队列同步器

AbstractQueuedSynchronizer特点 1.AQS可以实现独占锁和共享锁。 2.独占锁exclusive是一个悲观锁。保证只有一个线程经过一个阻塞点,只有一个线程可以获得锁。 3.共享锁shared是一个乐观锁。可以允许多个线程阻塞点,可以多个线程同时获取到锁。它允许一个

AbstractQueuedSynchronizer特点

1.AQS可以实现独占锁和共享锁。

2.独占锁exclusive是一个悲观锁。保证只有一个线程经过一个阻塞点,只有一个线程可以获得锁。

3.共享锁shared是一个乐观锁。可以允许多个线程阻塞点,可以多个线程同时获取到锁。它允许一个资源可以被多个读操作,或者被一个写操作访问,但是两个操作不能同时访问。

4.AQS使用一个int类型的成员变量state来表示同步状态,当state>0时表示已经获取了锁,当state = 0无锁。它提供了三个方法(getState()、setState(int newState)、compareAndSetState(int expect,int update))来对同步状态state进行操作,可以确保对state的操作是安全的。

5.AQS是通过一个CLH队列实现的(CLH锁即Craig, Landin, and Hagersten (CLH) locks,CLH锁是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。)

抽象

我们来扒一扒源码可以看到它继承于AbstractOwnableSynchronizer它是一个抽象类.

public abstract class AbstractQueuedSynchronizer 

    extends AbstractOwnableSynchronizer 

    implements java.io.Serializable 

AQS内部使用了一个volatile的变量state来作为资源的标识。同时定义了几个获取和改变state的protected方法,子类可以覆盖这些方法来实现自己的逻辑.

可以看到类中为我们提供了几个protected级别的方法,它们分别是:

//创建一个队列同步器实例,初始state是0 

protected AbstractQueuedSynchronizer() { } 

 

//返回同步状态的当前值。 

protected final int getState() { 

        return state; 

 

//设置同步状态的值 

protected final void setState(int newState) { 

        state = newState; 

    } 

 

//独占方式。尝试获取资源,成功则返回true,失败则返回false。 

protected boolean tryAcquire(int arg) { 

        throw new UnsupportedOperationException(); 

    }     

     

     

//独占方式。尝试释放资源,成功则返回true,失败则返回false。 

protected boolean tryRelease(int arg) { 

        throw new UnsupportedOperationException(); 

    } 

     

     

//共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源 

protected int tryAcquireShared(int arg) { 

        throw new UnsupportedOperationException(); 

    }     

     

     

//共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。 

protected boolean tryReleaseShared(int arg) { 

        throw new UnsupportedOperationException(); 

    } 

     

这些方法虽然都是protected方法,但是它们并没有在AQS具体实现,而是直接抛出异常,AQS实现了一系列主要的逻辑 由此可知,AQS是一个抽象的用于构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步器,比如我们提到的ReentrantLock,Semaphore,ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/biancheng/zx/2021/0527/7096.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部