医生说acquire()
处于独占模式:
// Acquires in exclusive mode, ignoring interrupts.
public final void acquire(int arg) {
if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
不受任何限制,它首先调用tryAcquire(arg)
。
如果一个线程已经保持了同步(已获取但未释放),则其他线程也可以不受限制地调用tryAcquire(arg),并且可能成功获取了同步。
简而言之,我的意思是,为什么AbstractQueuedSynchronizer在调用tryAcquire(arg)
之前不检查线程是否已保持同步。
尽管用户可以实现tryAcquire(arg)
,确保第二个tryAcquire(arg)
无法成功。但是我认为这是AQS的责任。
经过一会儿的思考,我同意在acquire()中实现排他性不好,最好在tryAcquire()中实现排他性。