2017-05-19 1 views
-1

다음은 경쟁 조건을 방지하는 방법에 대한 대답입니다. What is a race condition?불변 개체가 경쟁 조건을 방지하는 방법

가장 좋은 것은 부작용을 무료 무 기능, 가능한만큼 사용 immutables를 작성하는 것입니다. 그러나 이것이 항상 인 것은 아닙니다. 따라서 java.util.concurrent.atomic을 사용하면 동시 데이터 구조, 적절한 동기화 및 액터 기반 동시성이 도움이됩니다.

이 답변은 가능한 한 immutables를 사용한다고 말합니다. 나는 불변 객체가 경쟁 조건을 어떻게 막는 지 혼란 스럽다.

+0

개체가 불변 인 경우 액세스하는 스레드 수는 중요하지 않습니다. –

+4

수정할 수없는 경우 동시 수정을 할 수 없습니다. – user2357112

답변

1

적어도 하나의 스레드가 인스턴스 상태를 기록/변경하도록 허용 된 경우에만 경쟁 조건이 발생할 수 있습니다. 불변 인스턴스 읽기 전용는 그 상태 때문에 모든 스레드 개체의 상태 판독 동일한 값 (들)을 참조로 변경 될 수있다

0

data race 때 "두 개 이상의 스레드가 발생할 ... 동일한 메모리 위치에 동시에 액세스하고 적어도 하나의 액세스는 쓰기 용이며 스레드는 해당 메모리에 대한 액세스를 제어하기 위해 배타적 잠금을 사용하지 않습니다. "

데이터가 변경 불가능한 경우 데이터 쓰기가 불가능합니다. 쓰기 권한이 없기 때문입니다. 또한

상기 Java Memory Model guarantees은 : 객체가 구성된다

되면 생성자의 마지막 필드에 할당 된 값은 동기화없이 모든 다른 스레드에 표시됩니다.

0

계산 결과가 표현식과 명령문 평가 순서에 따라 달라질 때 경쟁 조건이 발생합니다.

식과 문장의 평가가 상태를 변경하여 부작용을 일으키는 경우 결과가 다를 수 있습니다.

코드의 모든 내용이 변경 가능하지 않은 경우 표현식 및 명령문을 평가하는 동안 부작용이없는 상태가 변경되지 않습니다. 따라서 평가 순서는 최종 결과에 영향을 미치지 않습니다.

다음 코드를 고려하십시오

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)에 영향을줍니다.

관련 문제