在利用AQS编写自己的同步器时,需要实现它的模板方法,但是在调用的时候,则是调用AQS原本就已经提供的方法,比如:
- acquire
- acquireInterruptibly
- acquireShared
- acquireSharedInterruptibly
- tryAcquireNanos
- tryAcquireSharedNanos
可以看出有三个不同的分类维度,适用于不同的调用场景:
1 acquire和acquireShared有什么区别?
2 acquire和acquireInterruptibly有什么区别?
3 acquire和tryAcquireNanos有什么区别?
acquire和acquireShared有什么区别?
两者意思上看起来就一个区别:一个是排它锁,一个是共享锁
- acquire:排它锁,忽略中断,调用期间可能会不断的阻塞然后解除阻塞,直到调用tryAcquire成功
- acquireShared:共享锁,忽略中断,除非调用tryAcquireShared成功,其它表现和acquire相同。
代码上来看:
- 一个添加共享节点,另外一个添加排它节点
- acquireShared获取成功后,会向下传播,acquire则只设置head节点
- 在acquireShared获取成功后,后面的节点也会继续执行acquireShared,而acquire则不会
r>0 近似于 tryAcquire都代表获取成功的意思。
acquire和acquireInterruptibly有什么区别?
两者唯一的区别:
- acquire不响应中断,只标记中断位
- acquireInterruptibly在遇到中断时,抛出InterruptedException异常
如图:
acquire和tryAcquireNanos有什么区别?
两个区别:
- tryAcquireNanos响应中断
- tryAcquireNanos有超时时间
最后
这里主要说明了AQS内部提供的acquire方法区别,在编写自己的同步机制时,需要注意