AQS的几个acquire方法区别

在利用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都代表获取成功的意思。

image-20200215100539964

acquire和acquireInterruptibly有什么区别?

两者唯一的区别:

  • acquire不响应中断,只标记中断位
  • acquireInterruptibly在遇到中断时,抛出InterruptedException异常

如图:

image-20200215101429867

acquire和tryAcquireNanos有什么区别?

两个区别:

  • tryAcquireNanos响应中断
  • tryAcquireNanos有超时时间
image-20200215101858916

最后

这里主要说明了AQS内部提供的acquire方法区别,在编写自己的同步机制时,需要注意

你可能感兴趣的:(AQS的几个acquire方法区别)