Java 关于信号量类

Java 关于信号量类,java,semaphore,doc,Java,Semaphore,Doc,请注意,FIFO排序必须适用于特定的内部 这些方法中的执行点 从 它们对内部执行点意味着什么?之后,文档立即说明: 因此,一个线程可以在另一个线程之前调用acquire,但可以在另一个线程之后到达排序点 这意味着这种情况是可能的: thread 1 thread 2 -------- -------- calls acquire() calls acquire()

请注意,FIFO排序必须适用于特定的内部 这些方法中的执行点


它们对内部执行点意味着什么?

之后,文档立即说明:

因此,一个线程可以在另一个线程之前调用acquire,但可以在另一个线程之后到达排序点

这意味着这种情况是可能的:

thread 1                 thread 2
--------                 --------
calls acquire()
                         calls acquire()
                         acquire() does its job
acquire() does its job
(其中,
acquires()执行其任务
是文档所称的“订购点”)

简而言之:不能保证调用
acquire()
的第一个线程能够首先获取信号量。可以保证的是,当它从
acquire()
返回时,其他
acquire()
调用方将不得不等待


这种情况很少见,但也有可能发生。

它们指的是acquire()方法内部的执行点。这意味着,在acquire()的实现中,有一个“排序点”,第一个到达那里的线程将第一个离开。因此,如果线程A GET调用在B之前输入acquire(),但B首先到达排序点,B将首先出来(尽管输入了acquire second)。

为什么thread1不继续?并让位给线程2继续?@Rollerball排序点可能不是
acquire()
中的第一条语句,同时操作系统可能已将线程排走。它取决于
.acquire()
的实现。一些JVM实现可能保证完全FIFO(这里的“I”表示第一次调度),但Javadoc明确表示这是不保证的。