많은 친구들이 키워드 휘발성에 대해 들었을 수도 있고 그것을 사용했을 수도 있습니다. Java 5 이전에는 논란의 여지가있는 키워드였습니다. 프로그램에서 사용하면 예상치 못한 결과가 발생했기 때문입니다. Java 5가 휘발성 키워드가 활력을 되 찾은 후에야만.
휘발성 키워드의 기능은 시스템의 모든 스레드가 키워드에 의해 수정 된 변수에 표시되는 모든 스레드를 공유하고 휘발성에 의해 수정 된 캐시 된 변수에서 스레드의 작업 메모리를 금지하는 것입니다.
휘발성 2 사용 시나리오 :
1. 가시성 : Java는 가시성을 보장하기 위해 휘발성 키워드를 제공합니다.
공유 변수가 휘발성에 의해 수정되면 수정 된 값이 즉시 기본 메모리로 업데이트되도록하고 다른 스레드가 읽어야 할 때 메모리의 새 값을 읽습니다.
그러나 일반 공유 변수는 수정 된 후 정상 공유 변수가 기본 메모리에 기록 된시기가 확실하지 않기 때문에 가시성을 보장 할 수 없습니다. 다른 스레드가 읽을 때 원래의 오래된 값은 여전히 메모리에있을 수 있으므로 가시성을 보장 할 수 없습니다.
또한 동기화 된 및 잠금도 가시성을 보장 할 수 있습니다. 동기화 및 잠금은 하나의 스레드만이 동시에 잠금을 획득하고 동기화 코드를 실행하도록 할 수 있습니다. 잠금 장치를 출시하기 전에 변수의 수정이 기본 메모리로 새로 고침됩니다. 따라서 가시성을 보장 할 수 있습니다.
먼저 코드를 살펴 보겠습니다. 스레드 1이 먼저 실행되고 스레드 2가 나중에 실행 된 경우 :
// 스레드 1boolean spop = false; while (! stop) {dosomething ();} // thread 2stop = true;이 코드는 매우 일반적인 코드이며, 많은 사람들이 스레드를 방해 할 때이 마크 업 방법을 사용할 수 있습니다. 그러나 실제로이 코드가 완전히 올바르게 실행됩니까? 스레드가 중단됩니까? 반드시 그런 것은 아닙니다. 아마도 대부분의 경우,이 코드는 스레드를 방해 할 수 있지만 스레드가 중단되지 않을 수도 있습니다 (이 가능성은 매우 작지만 일단 발생하면 죽은 루프가 발생합니다).
이 코드로 인해 스레드가 방해하지 않는 이유를 설명해 봅시다. 앞에서 설명한 바와 같이, 각 스레드는 작동 중에 자체 작업 메모리가 있으므로 스레드 1이 실행될 때 정지 변수의 값을 복사하여 자체 작업 메모리에 넣습니다.
그런 다음 스레드 2가 정지 변수의 값을 변경하지만 메인 메모리에 쓸 시간이 없으면 스레드 2는 다른 작업을 수행하면 스레드 2의 스톱 변수 변경에 대해 알지 못하므로 계속 루프됩니다.
그러나 휘발성으로 수정 한 후에는 다르게됩니다.
첫째 : 휘발성 키워드를 사용하면 수정 된 값이 주 메모리에 즉시 기록되도록합니다.
둘째 : 휘발성 키워드를 사용하는 경우 스레드 2가 수정되면 스레드 1의 작업 메모리의 캐시 변수 정지의 캐시 라인이 유효하지 않습니다 (하드웨어 레이어에 반영되면 CPU의 L1 또는 L2 캐시의 해당 캐시 라인이 잘못되었습니다).
셋째 : 스레드 1의 작업 메모리에서 캐시 변수 정지의 캐시 라인이 유효하지 않으므로 스레드 1은 변수 중지의 값을 다시 읽을 때 기본 메모리에서 읽습니다.
그런 다음 스레드 2가 정지 값을 수정하면 (물론, 여기에 2 개의 작업이 있으며, 스레드 2의 작업 메모리의 값을 수정 한 다음 메모리에 수정 된 값을 작성) 스레드 1의 작업 메모리에서 캐시 변수 중지의 캐시 라인이 잘못되었습니다. 스레드 1을 읽으면 캐시 라인이 유효하지 않다는 것을 알게됩니다. 캐시 라인의 해당 기본 메모리 주소가 업데이트 될 때까지 기다린 다음 해당 메인 메모리에서 최신 값을 읽습니다.
스레드 1이 읽는 것은 최신 올바른 값입니다.
2. 질서를 확인하십시오
휘발성 부울 시작 = false; // 스레드 1 : context = loadContext (); 시작 = true; // 스레드 2 : while (! inited) {sleep ()} dosomethingswithConfig (컨텍스트);컨텍스트가 초기화되었는지 확인하십시오.
3. Double Check
클래스 싱글 톤 {개인 휘발성 정적 싱글 턴 인스턴스 = null; private singleton () {} public static singleton getInstance () {if (instance == null) {synchronized (singleton.class) {if (instance = null) instance = new Singleton ()}} return}}}}}}}.위의 내용은 편집자가 소개 한 Java의 휘발성 키워드의 역할과 사용에 대한 자세한 설명입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!