java - java程序没有完成for循环为什么?
问题描述
我不明白为什么每次运行这段代码都会得到不同的答案?正确答案应该是一个 98098 两个 98099。有人知道为什么这不起作用吗?例如,一次答案返回“一个 49047 两个 49047”,然后另一次返回“一个 40072 两个 40072”。在这一点上我很困惑,缺乏任何合理的解释
public class TestThreads {
public static void main(String[] args){
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
Thread one = new Thread(t1);
Thread two = new Thread(t2);
one.start();
two.start();
}
}
class ThreadOne implements Runnable {
Accum a = Accum.getAccum();
public void run(){
for(int x = 0; x < 98; x++){
a.updateCounter(1000);
try{
Thread.sleep(50);
}catch(InterruptedException ex){
}
}
System.out.println("one " + a.getCount());
}
}
class ThreadTwo implements Runnable {
Accum a = Accum.getAccum();
public void run(){
for(int x = 0; x < 99; x++){
a.updateCounter(1);
try{
Thread.sleep(50);
}catch(InterruptedException ex){
}
}
System.out.println("two " + a.getCount());
}
}
class Accum {
private static Accum a = new Accum();
public static Accum getAccum(){
return a;
}
private int counter = 0;
public int getCount(){
return counter;
}
public void updateCounter(int add){
counter += add;
}
private Accum(){ }
}
解决方案
由于您有两个线程在没有线程安全的情况下更新相同的数据,因此一个线程很容易覆盖另一个线程设置的值。
每个线程都使用它自己的线程缓存值。例如
线程 1 加 1 一百次。它的值为 100
线程 2 加 1000 一百次。它的值是 100000
此时,选择一个值。说它是线程 1 的值。
线程 1 加 1 一百次。它的值是 200
线程 2 加 1000 一百次。它的值是 100100
这一次,选择了线程 2 的值。
最后平均只有一半的更新被保留,因为选择的值有点随机。
推荐阅读
- wordpress - 为什么超级表单插件中的国家元素为空?
- swift - ARKit – 光照估计
- python - Python Sparkpost 电子邮件标头 - CC 和 BCC 问题
- css - 如何使用引导程序以特定方式订购阵列
- python - 当我尝试从英制单位转换为公制时出错,反之亦然使用类似的代码?
- ios - 在 Android Studio 中使用 Flutter 构建 IOS 的问题
- java - 使用 gpg:sign-and-deploy-file 部署到 Maven Central 时收到 400 Bad Request
- python - 如何从 Compute Engine 虚拟机实例中的 Python 脚本查询 Cloud SQL
- python - 操作系统在打开文件时如何传递文件?
- mongodb - 如果不存在但不更新,如何在猫鼬中创建