在线代码链接:
https://onlinegdb.com/rkdjD1eIr

代码:

class SomeThread extends Thread{

    static volatile int count;
     public void run(){
        System.out.println("count value unsync"+count);
        synchronized(SomeThread.class){
            count = count + 1;
            System.out.println("Thread number = "+ (count));
        }

    }

}

class Main{
    public static void main(String args[]) throws Exception {

        for(int i =0;i<20;i++){
            SomeThread t = new SomeThread();
            t.start();
            //t.join();
            for(int j=0;j<1000000;j++);
            //t.sleep(100);
        }

    }
}


当运行给定程序时,得到以下输出:

count value unsync0
count value unsync1
count value unsync1
Thread number = 1
Thread number = 2
Thread number = 3
count value unsync3
Thread number = 4
count value unsync4
Thread number = 5
count value unsync5
Thread number = 6
count value unsync6
Thread number = 7
count value unsync7
Thread number = 8
count value unsync8
Thread number = 9
count value unsync0
// How is the count value displayed as 0 when count was just set to 9
count value unsync0
Thread number = 10
count value unsync0
count value unsync10
count value unsync10
count value unsync10
count value unsync10
count value unsync10
Thread number = 11
count value unsync0
count value unsync0
Thread number = 12
Thread number = 13
Thread number = 14
count value unsync0
Thread number = 15
Thread number = 16
Thread number = 17
Thread number = 18
Thread number = 19
Thread number = 20





不同步部分的计数值如何减少?
我的理解是,只要有机会运行计数值,线程就会显示计数值。
因此,如果线程1到来并增加了count变量的值,则对于所有线程,count的值应为1,因为我已将count变量描述为静态的。因此,count变量应该由每个线程共享。

因此,count的值绝不应小于在同步块中设置的值。
这意味着,如果计数值设置为1,则应始终显示大于1或等于1的计数值。

预期的输出是:count的值永远不能小于先前显示的count值;

最佳答案

其中一个线程可能已经完成了该语句(将int添加到String中),但是由于某种原因,则不得不等待一段时间。同时,其他线程正在输出各种值。等到第一个缓慢的线程轮到输出该句子时,它已经过时了。

10-07 19:11
查看更多