Java 信号量的大小是否与线程的执行顺序有关?

Java 信号量的大小是否与线程的执行顺序有关?,java,concurrency,semaphore,Java,Concurrency,Semaphore,查看1Z0-804考试的一些文献,我发现了以下示例问题: 考虑以下计划: 如果将语句#1替换为以下语句,则哪个选项为真?信号量机器=新信号量(2,真) 省略答案 正确答案的解释引起了我的注意: 第二个参数表示信号量对象的公平性策略。然而,在那里 是信号量对象的两个许可证;因此,您无法预测等待的顺序 人们将获得进入自动取款机的许可 我要说的是,不能仅仅因为线程的不确定性而预测顺序,而不是因为信号量中的许可数量,公平性参数保证等待的线程按照它们获取信号量的相同顺序被唤醒,但仍然无法确定获取顺序。我的

查看1Z0-804考试的一些文献,我发现了以下示例问题:

考虑以下计划:

如果将语句#1替换为以下语句,则哪个选项为真?
信号量机器=新信号量(2,真)

省略答案

正确答案的解释引起了我的注意:

第二个参数表示信号量对象的公平性策略。然而,在那里 是信号量对象的两个许可证;因此,您无法预测等待的顺序 人们将获得进入自动取款机的许可


我要说的是,不能仅仅因为线程的不确定性而预测顺序,而不是因为信号量中的许可数量,公平性参数保证等待的线程按照它们获取信号量的相同顺序被唤醒,但仍然无法确定获取顺序。我的解释正确吗?

我想说,因为它们都在构造函数中调用
start
,所以您只能保证线程的创建顺序和它们的开始顺序,您不能说它们的
运行
方法被调用的顺序


因此-本质上-您是正确的,信号量的数量在顺序中根本不起作用。

据我所知,是的,您的想法是正确的,因为公平信号量使用FairSync,它的获取机制不依赖于可用许可证的数量,而只依赖于线程队列中的第一个线程:

        protected int tryAcquireShared(int acquires) {
        for (;;) {
            if (getFirstQueuedThread() != Thread.currentThread() &&
                hasQueuedThreads())
                return -1;
         ....
        protected int tryAcquireShared(int acquires) {
        for (;;) {
            if (getFirstQueuedThread() != Thread.currentThread() &&
                hasQueuedThreads())
                return -1;
         ....