2013-07-02 4 views
2

AtomicBoolean은 동기화에 원시 코드를 사용합니다. 어떻게 자바 잠금으로 변환합니까? 나는 자체가 작업이 원자입니다 보장합니다 때문에이 (가) 필요하지 않은 동기화 된 알AtomicBoolean 잠금은 어디에 있습니까?

a.set(true) 

: 대

AtomicBoolean a = new AtomicBoolean(); 
synchronized (a) { 
    a.set(true); 
} 

: 사이의 차이를 무엇

. 하지만 (a) a.set (true)와 동일한 잠금이 동기화되어 있습니까?

답변

4

원자는 set/get과 같이 원 자성 인 경우 일부는 JVM을 사용하지만 다른 경우는 sun.misc.Unsafe 클래스에 의존합니다.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicBoolean.java

또한 가치가

이보고 : 당신의 코드를 확인하실 수 있습니다 슬프게도 그것은하지되지만, JDK에서 물건을 많이 사용된다

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/misc/Unsafe.java#Unsafe

public class. 더 명백하게 이름이 붙여서 공개적으로 사용할 수 있기 때문에 더 슬퍼졌습니다 .--)

원자 클래스의 전체 개념은 잠금과 동기화를 피하는 것이 좋습니다. 이는 종종 개선 될 것입니다. 공연. 이를 보호하기 위해 잠금을 사용할 필요는 없지만 잠금을 사용할 때 표준이 아닌 compareAndSwap 또는 incrementAndGet (숫자의 경우)와 같은 조작에 의존 할 수 있습니다.

0

이 :

a.set(true); 

내부적 JDK 1.7 AtomicBoolean.java의 코드를 살펴 가지고, 모든에 동기화되지 않습니다 (src.zip에서) :

/** 
* Unconditionally sets to the given value. 
* 
* @param newValue the new value 
*/ 
public final void set(boolean newValue) { 
    value = newValue ? 1 : 0; 
} 

예, 동기화 된 버전과 다릅니다.

1

No. AtomicBoolean 사실 모든 atomic classes은을 사용합니다.은 atomicitiy를 보장합니다.

+0

예로 선언하지만 잠금으로 객체를 복용 동기화하지 않습니다, 여전히 다른, 그것은 내부 JVM 명령을 사용합니다. – morgano

+0

@mogano 나는 자물쇠처럼 물건을 가져 갔다고 결코 말한 적이 없다. CAS는'Unsafe' 클래스를 통해'native' 메소드로 구현됩니다. – Jeffrey

+0

수여되었지만 게시물 끝에있는 질문에 초점을 맞추고있었습니다 (같은 잠금인지 여부) – morgano

0

동기화 키워드는 JMM에 따라 3 가지 보증을 제공합니다. 1. 원자 성 2. 가시성 3. 순서 재 배열

그러나 동기화는 자연적으로 차단됩니다.

java의 모든 원자 클래스 AtomicInteger, AtomicLong, AtomicBoolean 등 도 위의 세 가지 보증을 제공합니다. 하지만 그들은 다른 스레드를 차단하지 않습니다.

그들은 제공합니다 1. 원자 - compareAndSwap 연산을 사용하여. 2. 가시성 및 재정렬 - 기본 변수를 휘발성으로 선언하여 제공합니다.

가 AtomicInteger의 예를 들어 기본 INT 변수가 휘발성

private volatile int value; 
+0

잠금 코드의 주된 "문제"는 잠금을 얻는 시간과 시간을 가져 오는 사이에 잠잠 해지는 스레드입니다 해제하면 다른 스레드의 진행이 무기한 차단 될 수 있습니다. 'Atomic' 클래스는 작업 도중 획득 된 하드웨어 "잠금"이 매우 짧은 시간 내에 해제 될 것이라는 것을 보장합니다. * 스레드를 방해 할 수있는 아무 것도 그러한 것을 막을 수는 없습니다. – supercat