关于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;
}
`
如上图所示我们就实现了简单的非重入锁,那么为什么这样实现就可以了呢?下一个文章再讲吧
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(); }
`
如上图所示我们就实现了简单的非重入锁,那么为什么这样实现就可以了呢?下一个文章再讲吧
相关文章推荐
- 用Javascript进行简单的Table点击排序.
- subsets-ii
- 安全参透之旅第2章 httpracks工具使用
- Appium总结(二):Appium Ruby Console
- 关于“人才”的思考
- PHP 安全
- 14 Longest Collatz sequence - Project Euler
- GCD之串行队列与并发队列
- ER模型转关系模式
- Oracle数据库基础(四)--视图,序列,存储过程
- Gradle之旅-can not find tools.jar问题解决
- 关于测试的一段讨论
- SQL 语法
- JAVA设计模式--辛格尔顿
- [learn ros]尝试修改task_setup.py
- java初学者 歌手打分实例练习
- asp,IIS,权限
- 【衡阳八中noip模拟题】国色天香
- 如何练好正则表达式这个基本功
- Xcode中常用的快捷键操作