스레드 충돌과 데이터 경쟁간에 차이점이 있습니까?다중 스레드 : 스레드와 데이터 충돌에 의한 충돌 작업
두 스레드가 동일한 메모리 위치에 액세스하려고 시도하고 적어도 하나의 쓰기 작업이 발생하는 경우 충돌하는 작업이 발생한다는 것을 배웠습니다.
Here은 데이터 경주/경쟁 조건에 대한 위키 백과의 의견입니다.
어떻게 다른가요?
스레드 충돌과 데이터 경쟁간에 차이점이 있습니까?다중 스레드 : 스레드와 데이터 충돌에 의한 충돌 작업
두 스레드가 동일한 메모리 위치에 액세스하려고 시도하고 적어도 하나의 쓰기 작업이 발생하는 경우 충돌하는 작업이 발생한다는 것을 배웠습니다.
Here은 데이터 경주/경쟁 조건에 대한 위키 백과의 의견입니다.
어떻게 다른가요?
나는이 질문에 대한 좋은 대답을 마침내 발견했다.
TL : DR -
충돌하는 동작 -
데이터 경쟁 - 정렬되지 않은 연산들.
LONG VERSION -
내가 어떻게 충돌하는 작업이 발생 예와 함께 설명하고 그들이 어떻게 인종 무료 데이터 경우 식별.
Thread 1
및 Thread 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-with
및 happens-before
. done
은 원자 단위이므로 해당 연산 쌍은 서로 동기화됩니다. 또한 그 때문에 우리는 어느 한 쌍의 다른 동작을 happens before
중에서 선택할 수 있습니다. x = f()
가 스레드 1에 done.set(true)
전에 발생 및 done.get()
이 스레드 2 y = g(x)
전에 발생하기 때문에
x = f()
는
y = g(x)
전에 발생 말할 수 있습니다.
따라서 위의 예는 주문되었으며 결과적으로 데이터 경쟁이 없습니다.