为什么AbstractQueuedSynchronizer没有使acquire()独占?

时间:2019-03-15 10:43:43

标签: java java.util.concurrent

医生说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()中实现排他性。

0 个答案:

没有答案