Java之AQS代码原理解析

AQS(AbstractQueuedSynchronizer)是Java中实现锁和其他同步组件的基础,通过volatile的state字段和CAS操作管理资源。本文详细介绍了AQS的结构,包括排他锁和共享锁的实现,以及acquire和release方法的工作流程。此外,还探讨了自定义锁的实现,如tryAcquire和tryRelease等方法,以及AQS如何确保线程安全和并发控制。通过对AQS源码的分析,读者可以更深入地理解Java并发编程的底层机制。
摘要由CSDN通过智能技术生成

        AQS(AbstractQueuedSynchronizer)是各种锁实现的基础,提供了对资源(state字段)的获取与阻塞等待,阻塞的线程会被放进一个先进先出(FIFO)的同步队列里。各种锁是AQS的子类,子类必须实现一套用来改变state变量(volatile 修饰的变量)的方法,包括锁资源的获取方法与锁资源的释放方法。始终记得:volitile和cas操作铸就了AQS的辉煌

 

       众所周知,锁分排他锁和共享锁, AQS对锁的获取与释放也是分两种情况的,即SHARED与EXCLUSIVE两种模式。即如下图代码:

        EXCLUSIVE模式的锁必须实现tryAcquire和tryRelease两个抽象方法,同理,SHARED模式的锁必须实现tryAcquireShared和tryReleaseShared两个抽象方法。至于为什么AQS是个抽象类而不是接口的原因就在于次,比如你只需要排他锁就只用实现你需要的那两个方法,而不需要像接口那样需要实现全部抽象方法。当然也有同时实现两套方法的锁,如ReadWriteLock.


state资源

        state字段是AQS锁的核心,即是锁资源,该字段是volatile修饰的。volatile主要对所修饰的变量提供两个功能:①可见性②防止指令重排序。AQS框架都是对state变量的CAS增减操作,不通的增减方式从而实现了不同性质的锁,例如重入锁在同对象再次重入该锁锁住的资源时候,会对state字段进行加一操作。操作state字段有三个方法:

getState()

setState()

compareAndSetState()

这三个均是原子操作,compareAndSetState的实现依赖于Unsafe的compareAndSwapInt()方法,即

自定义锁方法

        如刚才介绍,有两种锁,有两套方法。每次自定义锁实现的时候需要自己去实现自己需要的方法。默认情况下不重写的方法返回抛出UnsupportedOperationException异常。以下是需要重写的方法:

isHeldExclusively():该线程是否正在独占资源。只有用到condition才需要去实现它。

tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。

tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。

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

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

源码及原理

一、排他锁

1、a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deamon Tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值