java - 谁能解释一下结果?
问题描述
public class Bank {
private int sum=0;
public void add(int n) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sum+= n;
System.out.println(sum);
}
}
public class Consumer implements Runnable {
Bank bank = new Bank();
@Override
public void run() {
for (int i = 0; i < 10; i++) {
bank.add(100);
}
}
}
public class Tes2 {
public static void main(String[] args) {
Consumer consumer = new Consumer();
Thread thread1 = new Thread(consumer);
Thread thread2 = new Thread(consumer);
thread1.start();
thread2.start();
}
}
这是一个多线程程序,模拟的是多个存款人到银行存钱,用来演示多线程的安全问题。由于代码不同步,所以它的第一个和第二个结果可能是200/200,200/300,等等。但是我不明白为什么你会得到 100/100,谁能解释一下?
解决方案
这是一个竞争条件。
两个线程都可以访问 sum。
总和 += n; 不是原子的
线程 1 读取总和 0
线程 2 换入,因为代码未同步读取 sum 为 0
线程 1 将 100 添加到 0 并将其写入 sum
线程 2 将 100 添加到 0 并将其写入总和覆盖线程 1s 的值
推荐阅读
- python - + 不支持的操作数类型:'int' 和 'str' - 尝试对一行中的所有整数求和
- java - 如何正确解析java中的tcp数据包?
- fortran - 程序在读取文件时收到信号 SIGSEGV
- javascript - 单击具有 html 数据属性的元素时如何触发操作
- c# - C#如何从json文件动态地制作treeview
- python-3.x - 模块“numpy”没有属性“max”
- javascript - 如何将玉模板下拉列表中的选定值传递给节点js中的rest api?
- visual-studio-code - 如何增加最近工作空间的数量?
- r - 基于闪亮应用程序中另一个数据框的列对数据框进行子集
- r - 如何按条件从列中复制字符串