アトミック変数とノンブロッキング同期化
1時半就寝、7時40分起床。
CAS (Compare And Swap)
これは前に読んだ記憶があるぞ。Atomicクラスの実装に使われている手法だったような。
アトミックなread-modify-writeをロックを使わずに実装したい場合、CASで実現可能。実行性能はロックよりも良好。
CASの基本的な態度としては、「とにかくやってみて、失敗したら再度挑戦する」。ある値を更新する際、その値が予想通りの値なら処理を続行して更新を行い、異なればすぐにリトライする。
public class CasCounter { private SimulateCAS value; public int get() { return value.get(); } public int increment() { int v; do { v = value.get(); } while (v != value.compareAndSwap(v, v + 1)); return v + 1; } private static class SimulateCAS { private int value; public synchronized int get() { return value; } public synchronized int compareAndSwap(int expectedValue, int newValue) { int oldValue = value; // 予想通りなら入れ替え if (oldValue == expectedValue) { value = newValue; } return oldValue; } } }
パフォーマンスは実際のCASと異なるが、おおよそこのような処理を行っている。
このように実装は複雑なので、実行性能は良好だが実際にはパフォーマンスが気になる箇所でのみ使う感じになるのかな。