同步方法未给出正确结果

时间:2018-09-16 19:28:32

标签: java multithreading

我写了下面提到的代码,我期望12000作为答案。但是没有得到正确的答案。每次运行我都会得到一个新的数字

程序包线程;

public class ThreadExp extends Thread {

    static volatile int count=0;

    public synchronized void increment() {
        count++;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ThreadExp a = new ThreadExp();
        a.start();
        ThreadExp a1 = new ThreadExp();
        a1.start();

        try {
            a.join();
            a1.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(count);
    }

    public void run() {
        for(int i=1; i<=6000 ;i++) { 
            increment();
        }
    }
}

1 个答案:

答案 0 :(得分:4)

非静态同步方法在this对象上同步(请参见JLS, §8.4.3.6)。因此,您使用的ThreadExp的两个实例不是相互排斥的执行increment()

您可以通过将increment()定义为static来解决问题,因为静态方法会在代表类型的class-Object上进行同步。

Elliott Frisch提到了另一种解决方案:使用AtomicInteger代替volatile int