首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java并发编程-AbstractQueuedSynchronizer源码分析(2)

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    }
返回列表