首页 > 解决方案 > 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(){ }

}

标签: java

解决方案


由于您有两个线程在没有线程安全的情况下更新相同的数据,因此一个线程很容易覆盖另一个线程设置的值。

每个线程都使用它自己的线程缓存值。例如

线程 1 加 1 一百次。它的值为 100

线程 2 加 1000 一百次。它的值是 100000

此时,选择一个值。说它是线程 1 的值。

线程 1 加 1 一百次。它的值是 200

线程 2 加 1000 一百次。它的值是 100100

这一次,选择了线程 2 的值。

最后平均只有一半的更新被保留,因为选择的值有点随机。


推荐阅读