JAVA : 如何查看同步线程计数器和普通线程计数器之间的输出差异?

JAVA : How to see the difference in output between a synchronized and normal thread counter?

我正在尝试了解线程同步。我已经实现了一个初始值为 0 的计数器。10 个线程每个将计数器递增 10 次。我猜下面代码的输出一定不是 100,因为我还没有同步它。但是,无论我是否同步 Counter.java 中的 incrementCount 方法,我总是将最终计数设为 100。有人可以解释一下我怎么会因为不同步而看到错误的输出吗?

package practise.java;

public class Counter {

    private int count = 0;

    public int getCount()
    {
        return count;
    }

    public void incrementCount()
    {
        count++;
    }

}


package practise.java;

public class SharedCounter1 extends Thread{

    Counter counter;

    public SharedCounter1(Counter c)
    {
        counter = c;
    }


    @Override
    public void run() {
        for(int i = 0;i<10;i++)
        {
            //System.out.println(this.getName() + "previous count :: "+counter.getCount());
            counter.incrementCount();
            //System.out.println("after incrementing ::: "+counter.getCount());

        }
    }

    public static void main(String[] args)
    {
        Counter c = new Counter();
        for(int i=0;i<10;i++)
        {
            System.out.println(i+"th thread starting");
            SharedCounter1 s= new SharedCounter1(c);
            s.start();try {
                s.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        System.out.println("Final Value::: "+c.getCount());
    }
}

您的线程是按顺序执行的:

        s.start();
        try {
            s.join();

你开始一个 thread,你等到它完成然后你开始下一个 thread。你应该启动所有线程然后等到所有线程都完成