这周看了AQS的源码略有所得,遂写文章记载一下。
AQS的全称是AbstractQueuedSychronizd,这个类是整个java.util.concurrent的核心之一,也可以说这个类是我们学习java 并发的一个突破口。
protected boolean tryAcquire(int arg){};//独占模式的获取
protected boolean tryRelease(int arg){};//独占模式的释放
protected int tryAcquireShared(int arg){};//共享模式的获取
protected int tryRelaseShared(int arg){};//共享模式的释
其中acquire(int arg)会调用tryAcquire(int arg),其它release(int arg)会调用tryRelease(int arg),其它的方法也类似。
如果我们想要实现自己的简单的非重入锁,那么如何去实现呢?首先去覆盖tryAcquire(int arg){}、tryRelease(int arg),就可以实现了简单的非重入锁了。` @Override
protected boolean tryAcquire(int arg) {
// TODO Auto-generated method stub
if (compareAndSetState( 0, 1 )) {
setExclusiveOwnerThread( Thread.currentThread() );
return true;
}
return false;
}
/*
* (non-Javadoc)
*
* @see
* java.util.concurrent.locks.AbstractQueuedSynchronizer#tryRelease(int)
*/
@Override
protected boolean tryRelease(int arg) {
if (getExclusiveOwnerThread().equals( Thread.currentThread() )) {
setExclusiveOwnerThread( null );
setState( 0 );
return true;
}
return false;
}
public void lock() {
acquire( 1 );
}
public boolean tryLock() {
return tryAcquire( 1 );
}
public void unlock() {
release( 1 );
}
public boolean isLocked() {
return isHeldExclusively();
}
`