java多线程--java.util.concurrent.locks.AbstractQueuedSynchronizer解析(只包含多线程同步示例)
(2011-04-18 00:55:00)
jdk1.5和jdk1.6的多线程api有些不同,这里主要针对jdk1.5的多线程api的AbstractQueuedSynchroniz
er进行说明。jdk
api中很多锁内部都实现并且使用了AbstractQueuedSynchronizer实现。
AbstractQueuedSynchronizer实际上就是一个FIFO有状态双向队列。它声明了private volatile
int
state即AbstractQueuedSynchronizer的状态域,state属性用来表示这个同步器被请求了多少次(每请求一次state值
加1)。它的结点用来保存在该AbstractQueuedSynchronizer上请求的线程,请求的模式(共享模式还是互斥模式),和线程的状态
(等待唤醒,处于condition的等待队列中,已被取消(中断))
以下是AbstractQueuedSynchronizer结点的内部实现:
static final class Node
{
static final int CANCELLED = 1;
static final int
SIGNAL =
-1;
static final int CONDITION = -2;
static final Node SHARED = new Node();
static final Node EXCLUSIVE = null;
volatile int waitStatus;
volatile Node prev;
volatile Node next;
volatile Thread thread;
Node nextWaiter;
final boolean isShared() {
return nextWaiter == SHARED;
}
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null)
throw new NullPointerException();
else