2012-08-22 2 views
1

AtomicReference를 사용하는 것만 큼 안전합니까?휘발성 변수 스레드를 직접 할당합니까? AtomicReference만큼 안전합니까?

private volatile String myMember; 

public void setMyMember(String s) { 
    myMember = s; 
} 

private final AtomicReference<String> myMember = new AtomicReference<>(); 

public void setMyMember(String s) { 
    while (true) { 
     String current = myMember.get(); 
     if (myMember.compareAndSet(current, s)) 
      break; 
    } 
}  
+1

두 번째 예제 메서드는 모두 myMember.set (s)와 같습니다. – jtahlborn

답변

5

코드는 "안전"하지만 AtomicReference 코드로 같은 일을하지 않습니다. 일반적으로 compareAndSet이있는 AtomicReference 루프는 누군가가 목록이나 개체에 무언가를 추가하려고 할 때 여러 스레드가있는 경쟁 조건으로부터 보호하려고 할 때 사용됩니다. 예를 들어

:

private final AtomicReference<List<String>> listRef = new AtomicReference<>(); 
... 
while (true) { 
    List<String> currentList = listRef.get(); 
    List<String> newList = new ArrayList<String>(currentList); 
    newList.add(stringToAdd); 
    // if we update the list reference, make sure we don't overwrite another one 
    if (listRef.compareAndSet(currentList, newList)) 
     break; 
} 

귀하의 경우, 당신은 그냥 volatile 잘 될 것입니다 만들기, 간단한 String 객체를 사용하고 있기 때문이다. compareAndSet을 수행 할 필요는 없습니다. 여전히 AtomicReference을 사용하려면 myMember.set(...)으로 전화하십시오.

3

첫 코드 조각은 완전히 스레드 안전하며 String은 스레드로부터 안전하며 변수에 할당하는 것은 원 자성이므로 충분합니다.

두 번째 것은별로 의미가 없지만 그러한 구성은 내부적으로 사용됩니다. 동시 환경에서 할당을 무시하지 않으려면 AtomicInteger을 입력하십시오. 귀하의 경우에는 volatile이 적합합니다.

관련 문제