一个简单的javamultithreading

好吧,我遇到了一个惊人的问题……

public class Test { private boolean[] state = new boolean[]{false, false}; public void createThread() { Thread th1 = new Thread(() -> { try { System.out.println("1"); Thread.sleep(2000); state[0]=true; } catch (InterruptedException e) { e.printStackTrace(); } }); Thread th2 = new Thread(() -> { try { System.out.println("2"); Thread.sleep(2000); state[1] = true; } catch (InterruptedException e) { e.printStackTrace(); } }); th1.start(); th2.start(); } public static void main(String args[]) throws InterruptedException { Test test = new Test(); test.createThread(); while (true) { // Thread.sleep(1); if (test.state[0] && test.state[1]) { System.out.println("stopped"); break; } } } } 

如果我不添加Thread.sleep(1)语句或其他代码,则不会打印“stop”。 如果我在中添加内容,则会打印“停止”。 这会怎么样? 每个答案都有帮助。

答案可能很简单,但在于细节。

保持状态的数组未标记为volatile ,因此while循环中的if-statement不会强制使用最新的值。

简单地改变

private boolean[] state = new boolean[] { false, false };

private volatile boolean[] state = new boolean[] { false, false };

会诀窍。