휘발성은 변수 수정자이고 동기화는 코드 조각이나 메소드에 대해 작동합니다. 세 가지 get 메소드의 코드는 다음과 같습니다.
1 int i1;2 int geti1() {return i1;}3 4 volatile int i2;5 int geti2() {return i2;}6 7 int i3;8 synchronized int geti3() {return i3;}
geti1()은 현재 스레드. 여러 스레드에는 i1 변수의 여러 복사본이 있으며 이러한 i1은 서로 다를 수 있습니다. 즉, 다른 스레드가 해당 스레드의 i1 값을 변경했을 수 있으며, 이 값은 현재 스레드의 i1 값과 다를 수 있습니다. Java 메모리 모델에는 변수의 현재 "정확한 값"을 저장하는 주 메모리(주 메모리 영역)가 있습니다. 또한 각 스레드에는 자체 메모리(예: 레지스터)가 있습니다. 성능상의 이유로 스레드는 액세스하는 변수의 복사본을 자체 메모리에 보관합니다. 이런 식으로 한 스레드의 메모리에 있는 동일한 변수의 값이 특정 순간에 다른 스레드의 메모리 값이나 메인 메모리의 값과 일치하지 않는 상황이 발생할 수 있습니다. 따라서 실제로 가능성이 있습니다. 주 메모리의 i1 값은 1이고 스레드 1의 i1 값은 2이며 스레드 2의 i1 값은 3입니다. 이로 인해 두 스레드 모두에서 각각의 i1 값이 변경됩니다. 1 및 스레드 2. 그리고 이 변경은 주 메모리나 다른 스레드로 전달되기 전에 발생합니다.
geti2()는 주 메모리의 i2 값을 가져옵니다. 변수를 휘발성으로 선언한다는 것은 해당 변수가 언제든지 다른 스레드에 의해 수정되므로 스레드 메모리에 캐시할 수 없다는 의미입니다. 즉, 변수가 휘발성으로 수정된 후에는 모든 스레드에서 해당 값을 변경하면 다른 모든 스레드는 즉시 동일한 값을 얻습니다. 따라서 휘발성 수정 변수는 액세스 시 일반 변수보다 약간 더 많은 리소스를 소비합니다. 스레드가 변수의 자체 복사본을 갖는 것이 더 효율적이기 때문입니다.
geti3() 메서드는 동기화에 의해 수정됩니다. 동기화를 사용하여 메서드나 코드 조각을 수정하면 최대 하나의 스레드가 동시에 코드를 실행할 수 있음을 보장할 수 있습니다. 휘발성 키워드가 스레드 간 데이터 동기화를 달성했는데 동기화가 필요한 이유는 무엇입니까? 두 개의 동시 스레드가 동일한 개체 개체의 동기화된(this) 동기화 코드에 액세스하는 경우 한 번에 하나의 스레드만 실행할 수 있습니다. 다른 스레드는 이 코드 블록을 실행하기 전에 현재 스레드가 이 코드 블록 실행을 완료할 때까지 기다려야 합니다. 그러나 한 스레드가 개체의 동기화된(this) 동기화 코드 블록에 액세스하면 다른 스레드는 여전히 개체의 동기화되지 않은(this) 동기화 코드 블록에 액세스할 수 있습니다. 특히 중요한 점은 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스할 때 객체의 다른 모든 동기화된(this) 동기화 코드 블록에 대한 다른 스레드의 액세스가 차단된다는 것입니다. 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 이 객체의 객체 잠금을 획득합니다. 결과적으로 객체의 모든 동기화된 코드 부분에 대한 다른 스레드의 액세스가 일시적으로 차단됩니다.
차이점 요약 :
첫째, 휘발성은 변수 수정자이고 동기화는 코드나 메서드에 대해 작동합니다.
둘째, 휘발성은 스레드 메모리와 메인 메모리(메인 메모리) 간의 변수 값만 동기화하는 반면, 동기화는 모니터를 잠그고 잠금 해제하여 모든 변수의 값을 동기화합니다. 분명히 동기화는 휘발성보다 더 많은 리소스를 소비합니다.
위 내용은 Java에서 휘발성 키워드와 동기화 키워드의 기능 및 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!