マルチスレッド合併に基づく一般的な問題(詳細解)


一つの概要
1.volatile
共有データが修正されると共有メモリ(ヒープまたは方法エリア)に同期されることを保証します。
2.スレッドがスタック中のデータにアクセスする過程
スレッドはスタックにデータのコピーを作成し、修正が完了したらデータをスタックに同期させます。
3.指令並び替え
実行効率を向上させるため、CPUは依存関係のないコマンドを並べ替えます。制御をやり直したい場合は、volatileを使って変数を修飾し、その変数を含むコマンドの前後のコマンドはそれぞれ独立して並べ替えられ、前後のコマンドは交差して並べ替えられません。
二よくある問題と対応
1.原子性問題
原子性とは、1つの操作が開始されると、同じCPU時間スライス内で実行されるというマルチスレッドの同時環境下で中断できないことを意味する。同じスレッドの複数の動作が異なるCPUタイムプレートで実行されると、中間に停滞が生じ、後の動作が実行時に他のスレッドによって修正される可能性がありますが、この修正が現在のスレッドに同期されていないため、現在のスレッド操作のデータは実際と一致しません。この不整合の実行によるデータ不一致の問題を原子的問題と呼ぶ。
2.可視性の問題
可視性問題の出現はスレッドアクセス共有データの方式と関連している。スレッドがスタック(メソッドエリア)の変数にアクセスする場合、まずスタックに変数のコピーを作成し、修正してからスタックに同期します。一つのスレッドがコピーを作成したばかりの場合、他のスレッドが変数を修正し、まだスタックに同期していない場合、二つのスレッドが同じ変数の同じ状態を操作する現象が発生します。例えば、i=9、変数iの初期値は9で、各スレッドの動作はすべてマイナス1です。両スレッドAとBは同時に変数にアクセスし、Bは先にi-1を実行し、結果i=8をヒープに同期する前に、Aスレッドもi-1を実行します。このときi=9の状態は2回実行され、スレッドセキュリティ問題が発生します。
スレッドのセキュリティ問題が発生した理由:共有データに対するスレッドの修正は、他のスレッドにすぐには見られない。
volatileは解決策を提供しています。
一つのスレッドがvolatileで修飾された共有データを修正すると、この修正はすぐにスタックに同期され、他のデータがスタックから共有データにアクセスするときに常に得られるのは、複数のスレッドの最新の値です。
volatileの欠陥:
volatileは、スレッドが一つのヒープからデータを取得する時に取得するのが現在のスレッドの中の最新値であることを保証します。スレッドがすでにヒープからデータをコピーしていたら、操作が完了する前に他のスレッドがデータを修正しても、修正後のデータはスレッドに同期しません。
3.秩序問題
実行効率を高めるために、CPUは依存関係のないコマンドを並べ替え、並べ替え後の実行結果は順序実行結果と同じです。
ソースコードには、例えば、

int i=0;
int y=1;
CPUは、実行時に「int y=1」を先に実行することができます。次に「int i=0;」を実行し、実行結果は、順序実行結果と同じです。
命令の並び替えはシングルスレッド環境では安全です。マルチスレッド環境では問題が発生する可能性があります。たとえば:
スレッドA:

s=new String("sssss");//  1
flag=false;//

コマンド2スレッドB:

while(flag){
doSome();
}

s.toUpperCase()///コマンド3は、スレッドAが順次実行されると、コマンド1を実行し、コマンド2を実行すると、スレッドBの実行に問題はない。コマンドの並べ替え後、スレッドAが先にコマンド2を実行すると、フラグ=trueがスレッド2に切り替わり、ループを終了し、コマンド3を実行します。sオブジェクトが作成されていないため、空のポインタが異常になります。
秩序問題が発生した原因:
一つのスレッドは、他のスレッドに対して共有データの修正操作に対して、スレッドBがスレッドAに対して命令1を実行してからコマンド2を実行するように要求していますが、コマンドの並べ替えのため、実際には要求された順序で実行されていません。このときスレッドセキュリティ問題が発生します。
解決策:
1.同じ時間に同じスレッドだけが共有データにアクセスできるように同期機構を利用して、効率が低い。
2.volatileを使用して、一つの命令にvolatile修飾変数が含まれている場合、このコマンドの実行順序は変わりません。このコマンドの前後のコマンドはそれぞれ独立して並べ替えができ、並べ替えができません。
以上のスレッド合併に基づくよくある問題(詳しくは)は、小編が皆さんに提供している内容の全てです。参考にしていただければと思います。よろしくお願いします。