一:AbstractOwnableSynchronizer介绍
AbstractOwnableSynchronizer是整个JUC的核心,在jdk1.5引入,用来控制java并发编程核心底层抽象模板。其提供整套的创建线程所需要的权锁以及同步器的基础,简称AQS。准确的的说AQS是一套模板,本身不提供任何的实现所有的线程控制、诊断都是交由其子类或者工具类实现的。目前jdk对其已经的实现类分为AbstractQueuedLongSynchronizer以AbstractQueuedLongSynchronizer
首先我们来看1.8文档对于其的介绍,仅提供了3个构造方法:
二:AQS解决方案的核心
AQS解决问题的核心就是:对于资源的访问状态的控制(资源是否共享、资源之间的竞争以及资源的访问队列等问题)。我们来看一下其实现的方法的同步器的资源的控制方式:
三:实现类AbstractQueuedLongSynchronizer支持的Api
四:实现类 AbstractQueuedLongSynchronizer实现的APi
五:AQS共同实现了什么
通过 2个API比较分析,我们来看看AQS模板到底实现了什么?
- 确定了资源是以独占方式/共享方式方式获取(独享锁/共享锁)
- 确定了是否中断
- 内部使用了CAS操作
- 返回当前运行线程、等待线程的API
- 返回同步状态值
- 确定了线程是否重入
六:AQS的基本原理
AQS是一个抽象的队列式同步器,其定义了整套的资源控制访问:
- AQS维护了一个共享资源(state)和一个等待队列(FIFO,多线程资源竞争被阻赛会进入次队列)。 其中state定义3个方法:getState(),setState(),compareAndSetState()
- AQS定义了资源共享的方式:独占Exclusive(只允许一个线程用到),共享share(允许多线程用到),自定义同步器 只要重写上面的setState()方法,这里方法里可以定义的方法(只要调用即可):