2014-11-21 2 views
0

는 자바에서 "비교 및 스왑"의 정확성에 작은 의심은 CAS (비교 및 스왑)가 완벽하게 작동합니까?

난 아직 예를

를 들어,이 CAS는 손실 값에 기회가 생각하고 있기 때문에 공유 자원 S를 할 수 있습니다, 값이 5

이고 스레드가 T1 및 T2 인 경우 값을 각각 새 값 6 및 7로 업데이트하려고합니다.

1. T1이 값을 5와 비교하여 같음을 찾았습니다. 2. T2가 값을 5와 비교하여 같음 3. T2는 7 으로 값을 설정합니다. 4. T1은 값을 6으로 설정합니다.

여기서 T1은 해당 시간에 5 인 이전 전류 값을 읽으므로 손실 된 T2로 설정된 값이 손실됩니다.

는 사람이에 설명해 드리겠습니다 당신이 때문에 CAS의 자성에 일어날 수 없습니다 설명 무엇

+0

[AtomicInteger.compareAndSet] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html#compareAndSet (int, % 20int) . 또한 실제로 실패 할 수있는 'weakCompareAndSet'도 있습니다. –

답변

2

.

"비교 후 교체"가 아니라 "비교 및 교체"입니다. 비교에는 별도의 단계가없고 스왑에는 다른 단계가 없습니다. 그것은 그것의 모든 아름다움입니다.

+0

안녕 카야 만, 그렇다면 비교 - 스왑은 항상 원자적인 방식으로 이루어지며 별도의 개별 단계가 필요하지는 않습니까? – Bravo

+0

그 말은 제가 말한 것입니다 – Kayaman

+0

thnx Kayaman , 나는 CAS의 원 자성 (atomicity of CAS)을 놓친 것 같다. – Bravo

관련 문제