Java에서 volatile 키워드의 역할 및 사용법 상세 설명
volatile 키워드의 역할은 시스템의 모든 라인이 이 키워드 수식에 대한 변수를 공유하고 볼 수 있도록 하는 것이다. 라인의 작업 메모리가volatile 수식에 대한 변수를 캐시하는 것을 금지할 수 있다.
volatile 2개의 사용 장면:
1. 가시성: Java는 가시성을 보장하기 위해volatile 키워드를 제공합니다.
공유 변수가volatile로 수식될 때, 수정된 값이 메모리에 즉시 업데이트되고, 다른 라인이 읽을 필요가 있을 때, 메모리에서 새 값을 읽을 수 있습니다.
그러나 일반적인 공유 변수는 가시성을 보장할 수 없다. 왜냐하면 일반적인 공유 변수가 수정된 후에 언제 메모리에 기록될지 확실하지 않기 때문이다. 다른 라인을 읽을 때 메모리에 원래의 오래된 값이 있을 수 있기 때문에 가시성을 보장할 수 없다.
또한synchronized와Lock을 통해서도 가시성을 확보할 수 있으며,synchronized와Lock은 같은 시간에 한 라인만 자물쇠를 가져와 동기화 코드를 실행할 수 있으며, 자물쇠를 풀기 전에 변수에 대한 수정을 메모리에 새로 고칠 수 있습니다.그래서 가시성을 보장할 수 있다.
먼저 코드를 보십시오. 만약에 스레드 1이 먼저 실행되고 스레드 2가 나중에 실행된다면:
// 1
boolean stop = false;
while(!stop){
doSomething();
}
// 2
stop = true;
이 코드는 매우 전형적인 코드로 많은 사람들이 라인을 끊을 때 이런 표기 방법을 채택할 수 있다.그러나 사실상 이 코드는 완전히 정확하게 실행됩니까?반드시 라인을 끊을 수 있습니까?반드시 그렇지는 않다. 아마도 대부분의 경우 이 코드는 라인을 끊을 수 있지만, 라인을 끊을 수 없게 할 수도 있다. (이 가능성은 매우 작지만, 일단 이런 상황이 발생하면 사순환을 일으킬 수도 있다.)다음은 이 코드가 왜 라인을 끊을 수 없게 할 수 있는지 설명해 드리겠습니다.앞에서 설명한 바와 같이 모든 스레드가 실행 과정에서 자신의 작업 메모리가 있다. 그러면 스레드 1이 실행될 때stop 변수의 값을 복사하여 자신의 작업 메모리에 넣는다.
그러면 스레드 2가stop 변수의 값을 변경한 후에 메모리에 쓸 겨를이 없습니다. 스레드 2는 다른 일을 하러 갔습니다. 그러면 스레드 1은 스레드 2가stop 변수에 대한 변경을 모르기 때문에 계속 순환할 것입니다.
하지만volatile로 수식하면 달라진다.
첫째:volatile 키워드를 사용하면 수정된 값을 메모리에 즉시 쓰도록 강제합니다.
둘째:volatile 키워드를 사용하면 스레드 2가 수정될 때 스레드 1의 작업 메모리에 있는 캐시 변수 stop의 캐시 줄이 무효가 됩니다(하드웨어 층에 반영되면 CPU의 L1 또는 L2 캐시에 대응하는 캐시 줄이 무효).
셋째: 스레드 1의 작업 메모리에서 캐시 변수stop의 캐시 줄이 무효이기 때문에 스레드 1이 변수stop의 값을 다시 읽을 때 메모리에서 읽습니다.
그러면 스레드 2에서 stop 값을 수정할 때 (물론 여기에는 두 가지 작업이 포함되어 있습니다. 스레드 2 작업 메모리의 값을 수정한 다음에 수정된 값을 메모리에 기록합니다.) 스레드 1의 작업 메모리에서 캐시 변수 stop의 캐시 줄을 무효로 합니다. 그리고 스레드 1을 읽을 때 자신의 캐시 줄이 무효임을 발견하면 캐시 줄에 대응하는 메모리 주소가 업데이트된 후에 대응하는 메모리로 가서 최신 값을 읽습니다.
그러면 스레드 1이 읽은 것이 최신 정확한 값입니다.
2. 질서성 보장
volatile boolean inited = false;
// 1:
context = loadContext();
inited = true;
// 2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);
context가 초기화되었는지 확인하십시오.3.double check
class Singleton{
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}
위에서 말한 것은 편집자가 여러분께 소개한 자바에서volatile 키워드의 작용과 용법에 대한 상세한 설명입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.