競合条件は、計算結果が式と文が評価される順序に依存する場合に発生します。
式と文の評価によって状態が変わり、副作用が生じると、結果が異なる場合があります。
コード内のすべてが不変の場合は、状態の変更はありません。式や文を評価する際の副作用はありません。したがって、評価の順序は最終結果に影響しません。
は、次のコードを考えてみましょう:
Map<String, Integer> map = Collections.singletonMap("key", 0);
public void increment() {
int val = map.get("key);
map.put("key", val + 1);
}
2もしスレッドが両方とも同じ値0
を読んで、両方がmap
に同じインクリメント値1
を入れ、同時に方法increment()
のすべての文を実行します。したがって、結果は1
になります。
(偶然に)両方のスレッドが他のスレッドが値1
を読み、値2
を置くだろうが値0
を読み、値1
を置く連続1つのスレッドすべての文を実行したい場合。
今マップは不変であろうと両スレッドは、以下の方法を実行するかどう:によって行われた変更のほかにない副作用が(存在しないため
public void logMap() {
System.out.println("Key has value " + map.get("key"));
}
の結果は常に、同じですSystem.out.println)。
オブジェクトが不変の場合、アクセスするスレッドの数は関係ありません。 –
変更ができない場合は、同時に変更することはできません。 – user2357112