マルチスレッド同時プログラミングの原子変数と非ブロック同期機構
1.非ブロックアルゴリズム
非ブロッキングアルゴリズムは、派生をロックすることなく、比較および交換などの低レベルの原子間ハードウェアのオリジナル形式によって、それらのスレッドを安全に派生させることができる同時アルゴリズムに属する.非ブロックアルゴリズムの設計と実現は極めて困難であるが、それらはより良いスループットを提供し、生存問題(例えばデッドロックと優先度反転)に対してもより良い防御を提供することができる.ロックの代わりに下層の原子化機器指令を用いる(CAS,compare-and-swap).
2.悲観的な技術
独占ロックは悲観的な技術である.最悪の場合(ロックをかけないと他のスレッドがオブジェクトの状態を破壊する)が発生すると仮定し、最悪の場合が発生しなくてもオブジェクトの状態をロックで保護する.
3.楽観技術
依存衝突モニタリング先に更新し、監視に衝突が発生した場合、更新を放棄してから再試行し、そうでなければ更新に成功する.現在、プロセッサには比較交換(CAS,compare-and-swap)などの原子化された読み取り-変更-書き込み命令がある.
4.CAS操作
CASには3つのオペランド、メモリ値V、古い予想値A、修正する新しい値Bがあります.そして、メモリ値Vは、予想値Aとメモリ値Vとが同時にBに変更された場合にのみ、何もしない.CASの典型的な使用パターンは、まずVからAを読み出し、Aに基づいて新しい値Bを計算した後、CASによってVの値をAからBに原子的に変更する(この間、Vの値を他の値に変更するスレッドがない限り).
リスト3.パフォーマンスではなく、比較および交換の動作を説明するコード
リスト4.比較と交換を使用してカウンタを実装
5.原子変数
原子変数は,ロック保護なしで原子更新動作をサポートし,その下層はCASで実現した.合計12個の原子変数があり、スカラークラス、更新器クラス、配列クラス、複合変数クラスの4つのグループに分けられます.最もよく使われる原子変数はスカラークラス:AtomicInteger、AtomicLong、AtomicBooleanおよびAtomicReferenceである.CASはすべてのタイプでサポートされています.
6.性能比較:ロックと原子変数
中低レベルの競争の下で、原子変数は高い伸縮性を提供することができ、原子変数の性能はロックを超えている.一方、高強度の競合では、ロックは競合をより効果的に回避することができ、ロックの性能は原子変数の性能を上回る.しかし、より現実的な状況では、原子変数の性能はロックの性能を上回るだろう.
非ブロッキングアルゴリズムは、派生をロックすることなく、比較および交換などの低レベルの原子間ハードウェアのオリジナル形式によって、それらのスレッドを安全に派生させることができる同時アルゴリズムに属する.非ブロックアルゴリズムの設計と実現は極めて困難であるが、それらはより良いスループットを提供し、生存問題(例えばデッドロックと優先度反転)に対してもより良い防御を提供することができる.ロックの代わりに下層の原子化機器指令を用いる(CAS,compare-and-swap).
2.悲観的な技術
独占ロックは悲観的な技術である.最悪の場合(ロックをかけないと他のスレッドがオブジェクトの状態を破壊する)が発生すると仮定し、最悪の場合が発生しなくてもオブジェクトの状態をロックで保護する.
3.楽観技術
依存衝突モニタリング先に更新し、監視に衝突が発生した場合、更新を放棄してから再試行し、そうでなければ更新に成功する.現在、プロセッサには比較交換(CAS,compare-and-swap)などの原子化された読み取り-変更-書き込み命令がある.
4.CAS操作
CASには3つのオペランド、メモリ値V、古い予想値A、修正する新しい値Bがあります.そして、メモリ値Vは、予想値Aとメモリ値Vとが同時にBに変更された場合にのみ、何もしない.CASの典型的な使用パターンは、まずVからAを読み出し、Aに基づいて新しい値Bを計算した後、CASによってVの値をAからBに原子的に変更する(この間、Vの値を他の値に変更するスレッドがない限り).
リスト3.パフォーマンスではなく、比較および交換の動作を説明するコード
public class SimulatedCAS {
private int value;
public synchronized int getValue() { return value; }
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (value == expectedValue)
value = newValue;
return oldValue;
}
}
リスト4.比較と交換を使用してカウンタを実装
public class CasCounter {
private SimulatedCAS value;
public int getValue() {
return value.getValue();
}
public int increment() {
int oldValue = value.getValue();
while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
oldValue = value.getValue();
return oldValue + 1;
}
}
5.原子変数
原子変数は,ロック保護なしで原子更新動作をサポートし,その下層はCASで実現した.合計12個の原子変数があり、スカラークラス、更新器クラス、配列クラス、複合変数クラスの4つのグループに分けられます.最もよく使われる原子変数はスカラークラス:AtomicInteger、AtomicLong、AtomicBooleanおよびAtomicReferenceである.CASはすべてのタイプでサポートされています.
6.性能比較:ロックと原子変数
中低レベルの競争の下で、原子変数は高い伸縮性を提供することができ、原子変数の性能はロックを超えている.一方、高強度の競合では、ロックは競合をより効果的に回避することができ、ロックの性能は原子変数の性能を上回る.しかし、より現実的な状況では、原子変数の性能はロックの性能を上回るだろう.