極客時間-java同時プログラミング実戦受講ノート(2)可視性、原子性、秩序性の問題:同時プログラミングBugのソース
JAva同時プログラミング実戦受講ノート(2)可視性、原子性、秩序性の問題:同時プログラミングBugのソース
同時発生の原因
ルーツ
プログラムの実行速度を速め、リソースの利用率を高めるために、さまざまな技術があり、これらの技術も異なる副作用をもたらしています. CPUにキャッシュがあり、キャッシュによって可視性の問題が発生する .オペレーティングシステムはプロセス、スレッドがあり、時間分割多重CPUがあり、スレッド切替は原子的な問題をもたらした .コンパイル最適化、秩序性の問題 をもたらす
CPUキャッシュによる可視性の問題
シングルコアCPU時代であれば、CPUにキャッシュがあり、影響はありません.1つのCPUしかないので、このCPUのキャッシュは順番にアクセスできないので、プログラムAがキャッシュ値を更新してから、プログラムBが実行し、必ずこの結果が見られます.しかし、マルチコア時代に入ると、各コアのCPUには独自のキャッシュがあり、異なるスレッドが異なるCPU上で実行され、更新されたデータが他のコアで実行されているプログラムに見えるとは限らない.
スレッド切り替えによる原子的な問題
オペレーティングシステムはCPUを時間分割多重化し、タスク切替を行う場合、切替はCPU指令レベルで発生し、高度な言語の文ではない.典型例:javaの
この3つの命令が実行されると,同時制御がなければ中断され,プログラムエラーが発生する可能性がある.
コンパイル最適化による秩序性の問題
典型的な例:二重検査による一例オブジェクトの作成例:
質問:
まとめ
一つの技術を採用すると同時に、それがもたらす問題が何なのか、どのように回避するかを明らかにしなければならない.
参考記事
極客時間著作権所有:https://time.geekbang.org/column/article/83682
同時発生の原因
ルーツ
プログラムの実行速度を速め、リソースの利用率を高めるために、さまざまな技術があり、これらの技術も異なる副作用をもたらしています.
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