3

메모리 가시성에 대한 작은 질문.원자 변수가 메모리 가시성을 보장합니까?

CodeSample1 :

class CustomLock { 

    private boolean locked = false; 

    public boolean lock() { 
     if(!locked) { 
      locked = true; 
      return true; 
     } 
     return false; 
    } 
} 

이 코드는 제 때문에, 멀티 스레드 환경에서 버그 경향 인 "IF-그때 법"및 제 때문에 전위 메모리 원자 아니다 예를 들어 threadA가 필드를 true로 설정하지만 나중에 필드 값을 읽으려는 threadB가이를 볼 수 없으며 여전히 false 값을 볼 수 있습니다.

가장 간단한 해결책은 CodeSample2에서와 같이 synchronized 키워드를 사용하는 것입니다.

CodeSample2 :

class CustomLock { 

    private boolean locked = false; 

    public synchronized boolean lock() { 
     if(!locked) { 
      locked = true; 
      return true; 
     } 
     return false; 
    } 
} 

이제 내가 무엇을 원자 변수를 사용하고자하고, 예를 들어, AtomicBoolean,

CodeSample3을 (질문은 모든 원자 변수에 적용)하는 경우 :

public static class CustomLock { 
    private AtomicBoolean locked = new AtomicBoolean(false); 

    public boolean lock() { 
     return locked.compareAndSet(false, true); 
    } 
} 

더 나은 성능 고려 사항 외에 이제 우리는 AtomicBoolean을 사용하여 CodeSample1에서 "if-then-act"와 비슷한 논리를 구현했습니다. 분명히있는 동안 정말, 내가 가진 문제는 어떤이 경우 스레드가 바로 같은시기에 CodeSample3에서 잠금() 메소드를 호출이다 , 코드가 논리적으로 무엇을 중요하지 않는 모든 쓰기 작업에 AtomicBoolean을 사용하면 메모리 가시성이 보장됩니까? 긴 이야기에 대한

죄송합니다, 그냥 ... 내가 가능한 고마워만큼 명확 가로 질러오고 있는지 확인

답변

0

내가 가지고있는 문제는 분명 동안 2 개 스레드, 바로 같은시기에 CodeSample3에서 잠금() 메소드를 호출하면 필드에 대한 모든 쓰기 작업이 지금 할 것이다 무엇 atomically, AtomicBoolean의 사용은 또한 메모리 가시성을 보장합니까? AtomicBoolean를 들어

메모리 가시성을 보장하기가 동시에 다른 스레드에서 여러 작업을 처리합니다. volatile 필드를 감싸므로 보장 할 수 있습니다. volatile의 언어 의미 체계로 메모리 장벽이 교차되어 여러 스레드가 최신 값을보고 모든 업데이트가 주 메모리에 게시됩니다.

Btw의 경우 lock(...) 메서드는 잠길 수 없으므로 tryLock(...)이어야합니다.