2012-04-02 2 views
6
나는 조금 혼란 스러워요

...원자 작업

는 모든 장기를 제외하고 \ 여러 스레드에서 편지를 쓰고 읽는 것이 사실이며, 이중 원자 작업이며, 단지 길이와 휘발성 사용하고 두 번해야하는 것은 무엇 작업?

+1

당신이 소스를 가지고 있습니까 다른 스레드가 즉시 업데이트 된 값을 볼 수있는 (그리고 그것을 밖으로 최적화 할 수 없음)을 의미 단지 값을 쓰는 것보다 다른 의미를 가지고 이거? – paislee

답변

8

JLS의 this section을 말하는 것 같습니다. doublelong을 제외한 모든 기본 유형에 대해 모든 스레드에서 값이 실제로 해당 변수에 기록된다는 것을 알 수 있습니다. (doublelong의 경우, 최초의 4 바이트는 1 개의 thread로 쓰여졌을 가능성이있어, 또 다른 4 바이트는 JLS의 그 섹션으로 지정되고있다). 다만, 와 같은의 값은 변수가 volatile으로 표시되지 않는 한 같은 시간. 이 읽기와 쓰기를 수행하는 x = x + 3을, 그리고 읽기와 쓰기 사이 x에 기록이있을 수 있기 때문에 심지어 volatile를 사용

, x += 3은 원자 없습니다. 그래서 우리는 AtomicInteger과 다른 유틸리티는 java.util.concurrent에 있습니다.

0

맞지 않습니다.

원자 연산은 다른 스레드가 처리 할 때까지 모든 스레드가 리소스에 액세스 할 때까지 기다리게하는 작업입니다. 나는 왜 다른 데이터 타입이 원자 적인지, 다른 것들은 그렇지 않은지 알지 못한다.

3

원자를 스레드로부터 안전하게 보호하지 마십시오. 긴 쓰기와 두 번 쓰는 것은 각각 두 개의 별도 32 비트 저장소이기 때문에 밑에 원자가되지 않습니다. long/double 필드가 아닌 것을 저장하고로드하는 것은 복합 쓰기가 아니라고 가정 할 때 완벽하게 원자 적입니다 (예 : i++).

원자 단위로 말하자면, 많은 스레드가 동일한 필드에 다른 객체를 작성한 결과 왜곡 된 객체를 읽지 않을 것입니다. Java Concurrency In Practice 3.1.2

가입일

밖으로의 얇은 에르 안전 : 스레드 동기화없이 변수를 판독하면,이 오래된 값을 볼 수 있지만, 적어도이 값을보고 그 일부 임의의 값 대신 실제로 스레드에 의해 배치되었습니다. 이는 휘발성이 아닌 64 비트 길이와 double을 제외한 모든 변수에 해당됩니다. JVM은 64 비트 읽기 또는 쓰기를 원 자성이 아닌 두 개의 별도 32 비트 조작으로 처리 할 수 ​​있습니다. 휘발성

0

는 원자