java - Java不同步线程,这个答案怎么会出现,怎么解释
问题描述
哪两个是可能的结果? (选择两个)
public class Cruiser {
private int a = 0;
public void foo() {
Runnable r = new LittleCruiser();
new Thread(r).start();
new Thread(r).start();
}
public static void main(String arg[]) {
Cruiser c = new Cruiser();
c.foo();
}
public class LittleCruiser implements Runnable {
public void run() {
int current = 0;
for (int i = 0; i < 4; i++) {
current = a;
System.out.print(current + ", ");
a = current + 2;
}
}
}
}
- A) 0, 2, 4, 0, 2, 4, 6, 6,
- B) 0, 2, 4, 6, 8, 10, 12, 14,
- C) 0, 2, 4, 6, 8, 10, 2, 4,
- D) 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
- E) 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
正确答案是 A 和 B,但是我真的不明白这段代码是如何在较低级别生成 A 的。
解决方案
A) 0, 2, 4, 0, 2, 4, 6, 6,
Thread-1: read a = 0;
Thread-2: read a = 0;
Thread-1: output 0, 2, 4
Thread-2: output 0
Thread-2: write 2 back to a
Thread-2: output 2, 4, 6
Thread-2: write 6 back to a;
Thread-1: read a = 6 and output 6
推荐阅读
- linux - 从 .desktop 文件上的拖放文件获取输入时,bash 脚本不会运行命令
- php - woocommerce webhook如何在收到的url页面上发出警报
- c# - 使用 Xpath 定位器时获取错误的文本值
- sql - 如何确定记录(对于某个集合)是否遵循正确的顺序?
- python - 如何根据线性回归中的迭代次数绘制成本函数?
- node.js - Javascript | 启动 CLI 应用程序以读取他们的终端
- javascript - 如何使用 Redux 删除索引上的购物车项目?
- json - 如果存在某些对象值,如何仅从 JSON 中获取项目
- reactjs - 您可以更改或设置 CSV MaterialTable 导出的样式吗?
- python - 搜索多个不同匹配项时如何找到子字符串的索引?