Java 다중 스레드 프로그래밍에서 휘발성이 종종 발견됩니다. 때때로이 키워드는 종종 동기화 또는 잠금과 혼동됩니다. 특정 분석은 다음과 같습니다.
다중 스레드 환경에서는 멤버 변수의 가시성 문제가 발생합니다. Java의 각 스레드에는 스레드 스택의 메모리 공간이있어 실행 중에 스레드의 변수 정보가 저장됩니다. 스레드가 특정 변수 값에 액세스하면 먼저 변수 주소를 기반으로 객체의 힙 메모리 또는 스택의 특정 컨텐츠 (기본 데이터 유형)를 찾은 다음이 스레드의 스레드 스택에 동일한 값 사본을 저장합니다. 그런 다음이 변수의 모든 작업은 스레드가 종료되기 전에 스택의 변수 내용과 관련이 없습니다. 스레드 스택의 사본에서 작동합니다. 작업이 완료되면 작업 결과가 메인 메모리에 다시 기록됩니다. 두 개의 스레드 A와 B가 있고 동료가 특정 변수 x를 운영합니다. A는 1을 x로 추가하고 B에 의해 얻은 사본은 x plus 1 또는 x의 결과 일 수 있습니다. 휘발성 키워드를 추가하기 위해 메모리의 최신 데이터 변수가 필요하므로 X에서 작동 할 때마다 스레드 스택의 변수 값이 메모리 변수의 값과 동일한 지 확인하고 다른 경우 다시로드됩니다.
예 : :
public class Threadsee {// t1 스레드는 플래그 값에 따라 해당 작업을 수행 할 것이며, 기본 스레드는 t1 public static void main (string [] args)의 값을 변경합니다. 스레드 t1 = 새 스레드 (th); t1.start (); Thread.sleep (1000); th.changeflag (); Thread.sleep (2000); System.out.println (th.getflag ()); }} class ThreadTest는 실행 가능 {// 스레드가 변수에 액세스하면 해당 스레드 스택에로드됩니다. 각 작업은 메모리 개인 휘발성 부울 스톱 플래그에서 최신 데이터를 얻어야합니다. @override public void run () {int i = 0; while (! stopflag) {i ++; System.out.println ( "=="+thread.currentThread (). getName ()); } system.out.println ( "스레드 마감 :"+i); } public void changeflag () {this.stopflag = true; System.out.println (thread.currentthread (). getName ()+"*********"); } public boolean getflag () {return stopflag; }} 위의 코드가 제거되면 Dead Loop에서 계속 실행됩니다.
그러나 휘발성은 스레드 안전 동기화를 보장 할 수 없습니다
예 : :
공개 클래스 스레드는 실행 가능 {static stresdsave sync = new ThreadSave (); 정적 휘발성 int j = 0; // 잠금 잠금 = 새로운 reintrantlock (); public void inscane () {// lock.lock (); for (int i = 0; i <100000000; i ++) {j ++; } // lock.unlock (); } @override public void run () {inscane (); } public static void main (String [] args)은 InterruptedException {스레드 t1 = 새 스레드 (sync); 스레드 t2 = 새 스레드 (동기화); t1.start (); t2.start (); t1.join (); t2.join (); System.out.println (J); }} 위의 코드에 따른 실행 결과는 2000000이 될 것으로 예상되지 않습니다.
휘발성에 의해 수정 된 변수의 경우 JVM 가상 머신은 기본 메모리에서 스레드 작업 메모리로로드 된 값이 최신임을 보장합니다.
예를 들어, 스레드 1과 스레드 2가 스레드 스택 및 메인 메모리 읽기 및로드 작업을 수행하고 메인 메모리의 카운트 값이 5라는 것을 알게되면 최신 값이로드됩니다. 스레드 1 힙 계수가 수정 된 후에는 기본 메모리로 기록되며 기본 메모리의 카운트 변수는 6이됩니다.
스레드 2는 이미 읽기 및로드 작업을 수행 했으므로 작업을 수행 한 후 기본 메모리 카운트의 가변 값도 6으로 업데이트됩니다.
이로 인해 두 개의 스레드가 휘발성 키워드를 제 시간에 수정 한 후 동시성이 발생합니다.
요약 :
휘발성은 스레드가 현재 스레드 스택의 변수 값이 기본 메모리의 데이터 값과 동일인지 확인하는 작업을 수행하도록합니다. 잠금 또는 동기화 된 경우 단일 스레드 만 특정 순간에 메소드에 들어가도록하여 스레드 안전을 보장합니다.
따라서 여러 스레드가 휘발성 변수를 수정하면 실제 논리적 의미가 없습니다. 스레드가 수정에 의존하는 다른 스레드의 변수 값을 수정하면 현재 유용합니다.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.