在线代码链接:
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中),但是由于某种原因,则不得不等待一段时间。同时,其他线程正在输出各种值。等到第一个缓慢的线程轮到输出该句子时,它已经过时了。