请注意,FIFO 排序必然适用于这些方法中的特定内部执行点。
来自文档
它们对内部执行点意味着什么?
在那之后,文档立即说:
因此,一个线程可能在另一个线程之前调用acquire,但在另一个线程之后到达排序点
这意味着这种情况是可能的:
thread 1 thread 2
-------- --------
calls acquire()
calls acquire()
acquire() does its job
acquire() does its job
(acquires() does its job
文档所说的“订购点”在哪里)
简而言之:不能保证,及时地,第一个线程调用首先acquire()
获取信号量。可以保证的是,当它从 中返回时,acquire()
其他acquire()
调用者将不得不等待。
这是一种罕见的情况,但有可能发生。
它们指的是 acquire() 方法内部的执行点。他们的意思是,在acquire() 的实现中,有一些“排序点”,第一个到达那里的线程将第一个离开。因此,如果线程 A 获得调用在 B 之前进入 acquire(),但 B 先到达排序点,则 B 将首先出来(尽管进入第二个)。