您的位置:首页 > 其它

关于AQS的学习(一)

2015-10-25 12:12 309 查看
这周看了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();
}


`

如上图所示我们就实现了简单的非重入锁,那么为什么这样实现就可以了呢?下一个文章再讲吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: