極客時間-java同時プログラミング実戦受講ノート(2)可視性、原子性、秩序性の問題:同時プログラミングBugのソース


JAva同時プログラミング実戦受講ノート(2)可視性、原子性、秩序性の問題:同時プログラミングBugのソース
同時発生の原因
ルーツ
プログラムの実行速度を速め、リソースの利用率を高めるために、さまざまな技術があり、これらの技術も異なる副作用をもたらしています.
  • CPUにキャッシュがあり、キャッシュによって可視性の問題が発生する
  • .
  • オペレーティングシステムはプロセス、スレッドがあり、時間分割多重CPUがあり、スレッド切替は原子的な問題をもたらした
  • .
  • コンパイル最適化、秩序性の問題
  • をもたらす
    CPUキャッシュによる可視性の問題
    シングルコアCPU時代であれば、CPUにキャッシュがあり、影響はありません.1つのCPUしかないので、このCPUのキャッシュは順番にアクセスできないので、プログラムAがキャッシュ値を更新してから、プログラムBが実行し、必ずこの結果が見られます.しかし、マルチコア時代に入ると、各コアのCPUには独自のキャッシュがあり、異なるスレッドが異なるCPU上で実行され、更新されたデータが他のコアで実行されているプログラムに見えるとは限らない.
    スレッド切り替えによる原子的な問題
    オペレーティングシステムはCPUを時間分割多重化し、タスク切替を行う場合、切替はCPU指令レベルで発生し、高度な言語の文ではない.典型例:javaのcount++;という文は、実際にCPU上で実行すると、大きく3つのCPU命令に分けられます.
     count        CPU   
    CPU   +1,    
             
    

    この3つの命令が実行されると,同時制御がなければ中断され,プログラムエラーが発生する可能性がある.
    コンパイル最適化による秩序性の問題
    典型的な例:二重検査による一例オブジェクトの作成例:
    public class Singleton {
      static Singleton instance;
      static Singleton getInstance(){
        if (instance == null) {
          synchronized(Singleton.class) {
            if (instance == null)
              instance = new Singleton();
            }
        }
        return instance;
      }
    }
    

    質問:instance = new Singleton();このコマンドは実際には3ステップに分けて実行されます.コンパイル最適化により、ここでinstanceが割り当てられていますが、割り当てられたメモリアドレスがnullを指している場合、マルチスレッド同時アクセスが発生するとエラーが発生する可能性があります.
    まとめ
    一つの技術を採用すると同時に、それがもたらす問題が何なのか、どのように回避するかを明らかにしなければならない.
    参考記事
    極客時間著作権所有:https://time.geekbang.org/column/article/83682