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

JAVA:如何看待同步线程计数器和普通线程计数器之间的输出差异?,java,multithreading,synchronization,counter,thread-synchronization,Java,Multithreading,Synchronization,Counter,Thread Synchronization,我试图理解线程同步。我实现了一个初始值为0的计数器。10个线程,每个线程使计数器递增10倍。我猜下面代码的输出一定不是100,因为我没有同步它。但我总是将最终计数设为100,无论我是否在Counter.java中同步incrementCount方法。有人能解释一下,由于没有同步,我怎么能看到错误的输出 package practise.java; public class Counter { private int count = 0; public int getCoun

我试图理解线程同步。我实现了一个初始值为0的计数器。10个线程,每个线程使计数器递增10倍。我猜下面代码的输出一定不是100,因为我没有同步它。但我总是将最终计数设为100,无论我是否在Counter.java中同步incrementCount方法。有人能解释一下,由于没有同步,我怎么能看到错误的输出

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());
    }
}
package practice.java;
公共课柜台{
私有整数计数=0;
public int getCount()
{
返回计数;
}
公共无效增量计数()
{
计数++;
}
}
包practice.java;
公共类SharedCounter1扩展线程{
柜台;
公共共享计数器1(计数器c)
{
计数器=c;
}
@凌驾
公开募捐{

对于(int i=0;i您的线程按顺序执行:

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

您启动一个
线程
,等待它完成,然后启动下一个
线程
。您应该启动所有线程,然后等待所有线程完成

即使使用下面的代码,我的输出仍然是一样的。
公共静态void main(String[]args)抛出中断异常{Counter c=new Counter();SharedCounter1[]数组=新的SharedCounter1[10];用于(int i=0;每个线程只需将计数器增加10倍……您认为这需要多长时间?我认为这几乎可以在短时间内完成。主线程启动下一个线程所需的时间将需要更多、更多、更多的时间!因此您应该计算更多、更多、更多、更多的值才能看到效果.