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