我正在阅读“ 14.5 AbstractQueuedSynchronizer”中的Java Concurrency in Practice,它说:


  支持独占获取的同步器应实现受保护的方法tryAcquiretryReleaseisHeldExclusively,而支持共享获取的同步器应实现tryAcquireSharedtryReleaseShared。 AQS中的acquireacquireSharedreleasereleaseShared方法调用同步器子类中这些方法的try形式,以确定操作是否可以继续。同步器子类可以使用getStatesetStatecompareAndSetState根据其acquirerelease语义检查和更新状态,并通过返回状态通知基类是否尝试获取或尝试获取。释放同步器成功。例如,从tryAcquireShared返回负值表示采集失败。返回零表示同步器是独占的;如果返回正值,则表示已非排他地获取了同步器。如果发行版可能具有尝试获取同步器的未阻塞线程,则tryReleasetryReleaseShared方法应返回true。


我不太明白那两个大胆的句子。


支持共享采集的同步器应实现tryAcquireSharedtryReleaseShared
tryAcquireShared返回零表示同步器是专门获取的。


为什么同步器专门支持共享采集?

最佳答案

同步器可能同时支持独占和共享获取-在这种情况下,从tryAcquireShared返回0是有意义的。根据AbstractQueuedSynchronizer文档:


  通常,实现子类仅支持以下模式之一,
  但是两者都可以在ReadWriteLock中发挥作用。子类
  仅支持排他或仅共享模式的不需要定义
  支持未使用模式的方法。

07-25 23:32