Java并发编程-AbstractQueuedSynchronizer源码分析(2)
- UID
- 1066743
|
Java并发编程-AbstractQueuedSynchronizer源码分析(2)
API说明实现自定义同步器时,需要使用同步器提供的getState()、setState()和compareAndSetState()方法来操纵状态的变迁。
方法名称 | 描述 | protected boolean tryAcquire(int arg) | 排它的获取这个状态。这个方法的实现需要查询当前状态是否允许获取,然后再进行获取(使用compareAndSetState来做)状态。 | protected boolean tryRelease(int arg) | 释放状态。 | protected int tryAcquireShared(int arg) | 共享的模式下获取状态。 | protected boolean tryReleaseShared(int arg) | 共享的模式下释放状态。 | protected boolean isHeldExclusively() | 在排它模式下,状态是否被占用。 | 实现这些方法必须是非阻塞而且是线程安全的,推荐使用该同步器的父类java.util.concurrent.locks.AbstractOwnableSynchronizer来设置当前的线程。
开始提到同步器内部基于一个FIFO队列,对于一个独占锁的获取和释放有以下伪码可以表示。
获取一个排他锁。
[url=][/url]
01 while(获取锁) {02 if (获取到) {03 退出while循环04 } else {05 if(当前线程没有入队列) {06 那么入队列07 }08 阻塞当前线程09 }10 }[url=][/url]
释放一个排他锁。
1 if (释放成功) {2 删除头结点3 激活原头结点的后继节点4 } |
|
|
|
|
|