2016-10-06 4 views
0

스레드 충돌과 데이터 경쟁간에 차이점이 있습니까?다중 스레드 : 스레드와 데이터 충돌에 의한 충돌 작업

두 스레드가 동일한 메모리 위치에 액세스하려고 시도하고 적어도 하나의 쓰기 작업이 발생하는 경우 충돌하는 작업이 발생한다는 것을 배웠습니다.

Here은 데이터 경주/경쟁 조건에 대한 위키 백과의 의견입니다.

어떻게 다른가요?

답변

1

나는이 질문에 대한 좋은 대답을 마침내 발견했다.

TL : DR -

충돌하는 동작 -

  • 가 동일한 메모리 위치 그들의
  • 적어도 하나를 액세스하는 다중 스레드
  • 의 참여는 기록 동작이다.

데이터 경쟁 - 정렬되지 않은 연산들.

LONG VERSION -

내가 어떻게 충돌하는 작업이 발생 예와 함께 설명하고 그들이 어떻게 인종 무료 데이터 경우 식별.

Thread 1Thread 2과 공유 변수 done을 고려하십시오.

AtomicBoolean done = new AtomicBoolean(false); 
int x = 0; 

Thread 1 

x = f(); 
done.set(true); 

Thread 2 
while(!done.get()) 
    { 
    /* a block */ 
    } 
y = g(x); 

여기 done.set() - done.get()x=f() - y=g(x) 충돌에 있습니다. 그러나 프로그래밍 메모리 모델은 두 개의 관계를 정의합니다 : - synchronizes-withhappens-before. done은 원자 단위이므로 해당 연산 쌍은 서로 동기화됩니다. 또한 그 때문에 우리는 어느 한 쌍의 다른 동작을 happens before 중에서 선택할 수 있습니다. x = f()가 스레드 1에 done.set(true) 전에 발생 및 done.get()이 스레드 2 y = g(x) 전에 발생하기 때문에

지금, 우리는 이전에 일어나는 이적과 관련 있기 때문에 x = f()y = g(x) 전에 발생 말할 수 있습니다.

따라서 위의 예는 주문되었으며 결과적으로 데이터 경쟁이 없습니다.