메모리 가시성에 대한 작은 질문.원자 변수가 메모리 가시성을 보장합니까?
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을 사용하면 메모리 가시성이 보장됩니까? 긴 이야기에 대한
죄송합니다, 그냥 ... 내가 가능한 고마워만큼 명확 가로 질러오고 있는지 확인
@JamesJenkins 질문이있을 때 항상 문서를 읽는 것이 편리합니다. –