之前由于需要查看了ThreadPoolExecutor的实现,然后发现了内部的封装工作线程的Worker类继承自AbstractQueuedSynchronizer类,查了一下,发现这个类封装了典型的并发锁操作,是java并发库java.util.concurrent的基础(作者就是鼎鼎大名的Doug Lea大神),花了大约一天的时间看了AbstractQueuedSynchronizer的原理和实现,发现这个Work类其实也就是简单实现了Mutex的原理。于是自己简单修改一下,将它放到CSDN上作为纪录。
class Mutex extends AbstractQueuedSynchronizer
{
// Lock methods
//
// The value 0 represents the unlocked state.
// The value 1 represents the locked state.
protected boolean isHeldExclusively() {
return getState() == 1;
}
protected boolean tryAcquire(int unused) {
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
protected boolean tryRelease(int unused) {
setExclusiveOwnerThread(null);
setState(0);
return true;
}
public void lock() { acquire(1); }
public boolean tryLock() { return tryAcquire(1); }
public void unlock() { release(1); }
public boolean isLocked() { return isHeldExclusively(); }
}
这个类与ReentrantLock的最大不同之处就是,这个Mutex是不可重入的!所以一不小心就会很容易造成死锁。这个例子也是主要用来简单说明一下AbstractQueuedSynchronizer的普通用法而已。
详细原理还是参考文章http://sunqi.iteye.com/blog/1962449吧。