1.コード分析:
public class SynTest {
private static int count=0;
public static void addCount(){
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
public static void main(String[] args) throws InterruptedException{
for(int i=0;i<1000;i++){
new Thread(()->SynTest.addCount()).start();
}
Thread.sleep(3000);
System.out.println("count:"+count);
}
}
2.実行結果:
3.問題の原因
1.可視性
2.アトミシティ
4:カウント++分析
4.1:JVM命令
4.2:分析
14 => 19(原子性)の順に厳密に従うと問題ありませんが、どこで問題が発生しますか?これがCPUローテーショントレーニングです。スレッド切り替えのCPU実行手順は次のとおりです
。1>スレッドAがcount = 0まで実行され、CPUがスレッドBを実行し、スレッドBがすべての手順を終了し、count = 1の場合、スレッド切り替えが発生します
。2> CPUがAスレッドに戻り、Aスレッドレジスタのカウントはまだ0であり、Aスレッドコードの実行を続行します。Aスレッドが終了した後、count = 1;
3> 2つのスレッドが終了した後、カウントは1であり、期待される2