계산 결과가 표현식과 명령문 평가 순서에 따라 달라질 때 경쟁 조건이 발생합니다.
식과 문장의 평가가 상태를 변경하여 부작용을 일으키는 경우 결과가 다를 수 있습니다.
코드의 모든 내용이 변경 가능하지 않은 경우 표현식 및 명령문을 평가하는 동안 부작용이없는 상태가 변경되지 않습니다. 따라서 평가 순서는 최종 결과에 영향을 미치지 않습니다.
다음 코드를 고려하십시오
Map<String, Integer> map = Collections.singletonMap("key", 0);
public void increment() {
int val = map.get("key);
map.put("key", val + 1);
}
이 만약 스레드가 모두 같은 값 0
를 읽고 모두가 map
에 같은 증가 값 1
을 넣어, 동시에 방법 increment()
의 모든 문을 실행합니다. 따라서 결과는 1
입니다.
(우연히) 두 스레드가 다른 스레드가 값 1
를 읽고 값 2
을 둘 것 동안 값 0
를 읽고 값 1
을 둘 것 연속적으로 하나 개의 스레드가 모든 문을 실행한다면.
맵 불변한다면 이제
다음과 같은 방법을 실행 할 스레드 둘 모두에 의한 변경 외에 (전혀 부작용이 없기 때문에
public void logMap() {
System.out.println("Key has value " + map.get("key"));
}
은 결과가 항상 동일한 것을 System.out.println)에 영향을줍니다.
개체가 불변 인 경우 액세스하는 스레드 수는 중요하지 않습니다. –
수정할 수없는 경우 동시 수정을 할 수 없습니다. – user2357112