2012-08-22 2 views
3

답변에서 Does a correctly synchronized program still allow data race?(Part I)은 좋은 예를 보여줍니다. 프로그램의 모든 실행은 순차적으로 일관된 것처럼 보이지만 데이터 경주는 여전히 있습니다. 그것은 JLS에서 다음과 같은 결론의 또 다른 방향은 사실이 아니다 이유를 알려줍니다 프로그램이 데이터 경주가 없습니다올바른 프로그램을 잘못 동기화 할 수 있습니까?

경우, 프로그램의 모든 실행이 순차적으로 일관되게 나타납니다.

지금 JLS 다른 conclucsion를 살펴 :

프로그램이 제대로 동기화되는 경우 모든 순차적으로 일관성있는 실행 데이터 경주 무료입니다 만.

위의 결론에 따르면 위 예제는 올바르게 동기화되지 않았으므로 올바른 프로그램이 잘못 동기화 될 수 있습니까?

+0

** ** 내가 곧 "부르는"것입니다! –

답변

2

아마도 올바른 프로그램이 무엇인지 먼저 정의해야합니다 (쉽지 않음). JCiP는 (다른 상황에서)

을 제안합니다.

제공된 정의를 사용하면 정확합니다. 그러나 올바르게 동기화되지 않았습니다 (hash에 데이터 경쟁이 있음).

==> 예제에 의해 입증 된 바와 같이 올바른 프로그램이 올바르게 동기화되지 않을 수 있습니다.

1

OP의 질문에 대답하는 것처럼 보이지 않지만 의견을 남기고 있습니다.


당신은 동기화 된 컬렉션을 사용하는 경쟁 조건의 수를 얻을 수 있습니다. 예 :

Vector<Integer> vector = ... 
vector.add(1); 

vector.set(0, 1 + vector.get(0)); 

각 방법은 아직 동기화 경합 상태가된다. 이는 스레드 T1 및 T2가 수행 할 수 있기 때문입니다. 이 경우 tmp1 == 일반적으로 그렇지 않다 tmp2에서

T1: int tmp1 = vector.get(0); 
T2: int tmp2 = vector.get(0); 
T1: vector.set(0, 1 + tmp1); 
T2: vector.set(0, 1 + tmp2); 

.

올바르게 동기화하려면 다음을 수행하여 전체 시간 동안 잠금을 유지해야합니다.

synchronized(vector) { 
    vector.set(0, 1 + vector.get(0)); 
} 
+0

Peter, 당신은 OP가 요구하는 * 데이터 경쟁 *의 사례를 시연하지 않습니다. OP는 정말로 용어의 정확한 사용법에 대해 구속되어 있습니다. 그는 지난 편지에서 지난날 JLS를 읽고 다시 읽었습니다. –

+0

@MarkoTopolnik Ok, '경쟁 조건'과 ' 데이터 경주? –

+0

* 데이터 레이스 *는 * happen-before *로 정렬되지 않은 비 휘발성 변수에 대한 스레드 간 충돌 동작을 포함하는 매우 좁은 종류의 경쟁 조건입니다. 코드에서 모든 액세스가 정렬됩니다. –

관련 문제