首页 > 解决方案 > MultiThread_Unable 得到预期的输出

问题描述

```
package programs;

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 Accum{
    
    private static Accum a = new Accum();
    private int counter = 0;
    
    private Accum() {
    }
    
    public static Accum getAccum() {
        return a;
    }
    
    public void updateCounter(int add) {
        counter +=add;
    }
    
    public int getCount() {
        return counter;
    }
}

class ThreadOne implements Runnable{
    Accum a = Accum.getAccum();

    @Override
    public void run() {
        for(int x=0;x<98;x++) {
            a.updateCounter(1000);
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
                                    
        }
        System.out.println("one "+ a.getCount());
    }
    
}

class ThreadTwo implements Runnable{
    
    Accum a = Accum.getAccum();
    @Override
    public void run() {
    for(int x=0;x<99;x++) {
        a.updateCounter(1);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("two "+ a.getCount());   
    }
}
```

预期输出应如下所示

一个98098
两个98099

但是我对一和二的值相同。
这是预期的还是两者都应该导致不同的值?
当涉及到线程优先级时,即使 jvm 调度程序负责选择首先执行哪个线程,那么这个程序的结果如何,其中两个 void 运行 for 循环的程序,分别为 98 和 99,这应该导致两个不同的值否则相同

标签: javamultithreadingthread-safetyoutputcounter

解决方案


这是因为共享数据是NOT同步的。

要解决此问题,请使用synchronized接触shared data, 的方法来制作 Accum 类Thread-Safe

例子:

class Accum{
    
    private static Accum a = new Accum();
    
    private int counter = 0;
    
    private Accum() {
        
    }
    
    public static Accum getAccum() {
        
        return a;
    }
    
    public synchronized void updateCounter(int add) {
        counter +=add;
    }
    
    public synchronized int getCount() {
        
        return counter;
    }
}

推荐阅读