分散型で高い同時実行性-1-同時実行性の質問の紹介

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

被切换
B
CPU
ThreadA
A线程寄存器中count=0
线程切换
A线程中count++
A线程中count=1写入内存
B线程寄存器count=0
ThreadB
B线程count++
B线程中count=1写入内存

おすすめ

転載: blog.csdn.net/qq_28500837/article/details/109648710