为什么下面的多线程代码不起作用?答案应该是20000我相信

时间:2016-02-20 23:59:42

标签: java multithreading synchronization

为什么在增量方法同步时我没有得到20000。我使用runnable做了同样的事情并且它有效。

   public class ThreadClass extends Thread
    {
            static int count=0;
            public synchronized void increment()
            {
                count++;
            }

    public void run()
    {
        for(int i=0;i<10000;i++)
        {
            increment();
        }
    }; 

}

public class Main {

    public static void main(String[] args) {

        ThreadClass t1=new ThreadClass();
        ThreadClass t2= new ThreadClass();

        t1.start();
        t2.start();

        try {
            t2.join();
            t1.join();
            } 
        catch (Exception e) 
            {
            e.printStackTrace();
            }
        System.out.println(ThreadClass.count);
    }

}

1 个答案:

答案 0 :(得分:2)

JLS,适用于synchronized方法,clearly states以下内容:

  

对于实例方法,使用与此关联的监视器(调用该方法的对象)。

因此,两个ThreadClass实例将独立锁定,并且没有公共锁保护对count的错误写入。

Threadclass.class上显式同步或使increment()静态以实现同步,使写入安全。