我正在阅读“ 14.5 AbstractQueuedSynchronizer”中的Java Concurrency in Practice,它说:
支持独占获取的同步器应实现受保护的方法tryAcquire
,tryRelease
和isHeldExclusively
,而支持共享获取的同步器应实现tryAcquireShared
和tryReleaseShared
。 AQS中的acquire
,acquireShared
,release
和releaseShared
方法调用同步器子类中这些方法的try
形式,以确定操作是否可以继续。同步器子类可以使用getState
,setState
和compareAndSetState
根据其acquire
和release
语义检查和更新状态,并通过返回状态通知基类是否尝试获取或尝试获取。释放同步器成功。例如,从tryAcquireShared
返回负值表示采集失败。返回零表示同步器是独占的;如果返回正值,则表示已非排他地获取了同步器。如果发行版可能具有尝试获取同步器的未阻塞线程,则tryRelease
和tryReleaseShared
方法应返回true。
我不太明白那两个大胆的句子。
支持共享采集的同步器应实现tryAcquireShared
和tryReleaseShared
。
从tryAcquireShared
返回零表示同步器是专门获取的。
为什么同步器专门支持共享采集?
最佳答案
同步器可能同时支持独占和共享获取-在这种情况下,从tryAcquireShared返回0是有意义的。根据AbstractQueuedSynchronizer
文档:
通常,实现子类仅支持以下模式之一,
但是两者都可以在ReadWriteLock中发挥作用。子类
仅支持排他或仅共享模式的不需要定义
支持未使用模式的方法。