繁体   English   中英

Java同步方法无法按预期工作

[英]Java synchronized method does not work as expected

我做了一些研究,但我找不到正确的答案。

public class MultiThreadTwo
{
    private int count = 0;
    public synchronized void increment() // I synchronized it here
    {
        count++;
    }
    public static void main (String [] args)
    {
        MultiThreadTwo app = new MultiThreadTwo();
        app.doWork();
    }
    public void doWork()
    {
        Thread t1 = new Thread(new Runnable() {
            public void run(){
                for (int i=0;i<100;i++ )
                    {
                        increment(); // increments
                    }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            public void run()
            {
                for (int i=0;i<100;i++ )
                    {
                        increment(); // increments
                    }
            }
        });

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

        System.out.println("Count is : "+count);

        try
        {
            t1.join(); // wait for completes
            t2.join(); // wait for completes
        }catch(InterruptedException e)
        {
            e.printStackTrace();
        } 
    }
}

我的输出总是像200,182,171,65,140一样。 我该如何解决这个问题,我知道我可以检查count的值,如果它不是我期望的值,我可以一遍又一遍地调用运行,但这对我没有任何帮助。 同步关键字不应该解决这种情况吗?

我想念什么?

解决方案:加入后打印计数解决了我的问题。

如果在确定结果的优先级之前加入线程并使计数易变,则总会得到200。

尽管挥发性物质在这里不会造成危害,但没有必要。 从t1和t2进行计数的访问工作正常,因为增量方法在同一个对象上同步,并且在线程上调用join创建一个事前发生的关系。 因此,即使没有volatile,也可以确保主线程看到正确的count值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM