gpt4 book ai didi

java - 竞赛条件:整数的最小和最大范围

转载 作者:行者123 更新时间:2023-12-01 23:10:32 25 4
gpt4 key购买 nike

最近在一次采访中有人问我这个问题。

给定以下代码,静态整数num的最小和最大可能值是多少?

import java.util.ArrayList;
import java.util.List;

public class ThreadTest {
private static int num = 0;

public static void foo() {
for (int i = 0; i < 5; i++) {
num++;
}
}

public static void main(String[] args) throws Exception{
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Task());
threads.add(thread);
thread.start();
}
for (int i = 0; i < 5; i++) {
threads.get(i).join();
}
// What will be the range of num ???
System.out.println(ThreadTest.num);
}
}

class Task implements Runnable {
@Override
public void run() {
ThreadTest.foo();
}

}


我告诉他们,最大值将为25(在没有竞争条件的情况下),而最小值将为5(在每次迭代时所有线程之间的竞争条件的情况下)。
但面试官说,最小值甚至可以低于5。
那怎么可能?

最佳答案

我声称最小值可能是2。

这样做的关键是num++的非原子性,即它是读和写,它们之间可能有其他操作。

调用线程T1..T5:


T1读取0,T2读取0;
T1写入1,然后读取和写入3次。
然后T2写1;
然后T1读取1;
然后T2-5完成所有工作
然后,最后,T1写入2。


(注意:如果每个线程至少有2个,则结果2既不取决于线程数,也不取决于迭代数。)

对此的诚实回答是:确实没有关系。如JLS 17.4.5中所定义,存在数据争用:


当程序包含两个冲突的访问时(第17.4.1节[“如果至少一个访问是写操作,则对同一变量的两次访问(读或写)被认为是冲突的。”])通过事前发生的关系,它据说包含一个数据竞争。


(线程中的动作之间没有发生事前关系)

因此,您无法有效地依靠它的作用。这只是不正确的代码。

(此外,我知道此问题的答案并不是因为一些来之不易的调试多线程代码或深入的技术阅读:之所以知道这一点,是因为我之前在其他地方都已经阅读过此答案。这是一个小技巧,仅此而已,所以问最小值不是一个很好的面试问题)。

关于java - 竞赛条件:整数的最小和最大范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58378770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com