我声称最小值可能是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节[“如果至少一个访问是写操作,则对同一变量的两次访问(读或写)被认为是冲突的。”])通过事前发生的关系,它据说包含一个
数据竞争 。
(线程中的动作之间没有 发生事前 关系)
因此,您无法有效地依靠它的作用。这只是不正确的代码。
(此外,我知道此问题的答案并不是因为一些来之不易的调试多线程代码或深入的技术阅读:之所以知道这一点,是因为我之前在其他地方都已经阅读过此答案。这是一个客厅技巧,仅此而已,所以
问最小值 不是一个很好的面试问题)。



