线程意外地操纵了变量

沙发
public class Main {
    static int i = 0;

    public static void main(String[] args) {
        for (; i < 2; i++)
            new Thread(() -> System.out.println(i)).start();
    }
}

我希望上面的代码可以打印出来

0
1

或者

1
0

但令我惊讶的是

2
2

阿卜杜拉·泰利奥卢(Abdullah Tellioglu)

我运行相同的程序,它也为我提供了相同的结果。但是如果你这样运行

for (; i < 2; i++) {
    Thread.sleep(10);
    new Thread(() -> System.out.println(i)).start();
}

结果变成

1
2

如果在Thread.sleep(10)下面添加new Thread(() -> System.out.println(i)).start();则输出

0
1

这是因为当前线程(主线程)在线程之前执行循环。

  1. 主线程启动。
  2. 循环开始。
  3. 线程-已创建1个(线程仍处于空闲状态)
  4. 连续循环(i = 1)
  5. 线程-已创建2个(线程处于空闲状态)
  6. 循环结束。
  7. 主线程结束。

线程1和线程2在代码的第二步和第七步之间开始。操作系统处理线程调度,因此您无法在该程序中得到预期的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章