"안녕, 아미고!"

"안녕, 엘리!"

"휘발성 수식어에 대해 말씀드리려고 합니다. 그게 뭔지 아세요?"

"실과 관련된 것입니다. 정확히 기억이 나지 않습니다."

"그럼 잘 들어. 다음은 몇 가지 기술적인 세부 사항입니다."

"컴퓨터에는 두 가지 유형의 메모리가 있습니다. 전역(일반) 메모리와 프로세서에 내장된 메모리입니다. 내장 프로세서 메모리는 레지스터, 첫 번째 수준 캐시(L1), 두 번째 수준 캐시(L2) 및 세 번째 수준(L3)."

"이러한 유형의 메모리는 속도가 다릅니다. 가장 빠르고 작은 메모리는 레지스터, 프로세서 캐시(L1, L2, L3), 마지막으로 글로벌 메모리(가장 느린)입니다."

"글로벌 메모리와 프로세서 캐시는 매우 다른 속도로 작동하므로 Java 머신은 각 스레드가 가장 자주 사용되는 변수를 로컬 스레드 메모리(프로세서 캐시)에 저장할 수 있도록 합니다."

"이 프로세스를 어떻게든 제어할 수 있습니까?"

"그렇지 않습니다. 모든 작업은 Java 시스템에서 수행됩니다. 성능 최적화에 있어서는 매우 지능적입니다."

"하지만 여기 내가 이 말을 하는 이유가 있습니다. 한 가지 작은 문제가 있습니다. 두 개의 스레드가 동일한 변수로 작업할 때 각 스레드는 자체 로컬 캐시에 복사본을 저장할 수 있습니다. 그러면 한 스레드가 변수를 변경할 수 있지만 두 번째 스레드는 변수를 변경할 수 있습니다. 여전히 자체 변수 사본으로 작업하고 있기 때문에 변경 사항이 표시되지 않을 수 있습니다."

"글쎄, 그럼 어떻게 할 수 있니?"

"Java의 작성자는 이 상황에 대해 특별한 키워드를 제공했습니다. 휘발성입니다. 변수가 다른 스레드에서 액세스되는 경우 변수를 휘발성 수정자로 표시해야 Java 시스템이 해당 변수를 캐시에 넣지 않습니다. 이것이 일반적으로 사용되는 방식입니다. 외모:"

public volatile int count = 0;

"아, 기억나네요. 당신은 이미 이것을 언급했습니다. 나는 이미 이것을 알고 있습니다."

"물론이죠. 하지만 당신은 내가 말했을 때만 그것을 기억했습니다."

"어, 글쎄요, 조금 잊었네요."

"반복은 배움의 어머니!"

"다음은 휘발성 수정자에 대한 몇 가지 새로운 사실입니다. 휘발성 수정자는 변수를 안전하게 읽고 쓸 수만 보장합니다. 안전하게 변경된다는 보장은 없습니다."

"차이점이 뭐야?"

"변수가 어떻게 변경되는지 살펴보십시오."

암호 실제로 일어나는 일: 설명
count++
register = count;

register = register+1;

count = register;
1단계.
변수 카운트의 값이 전역 메모리에서 프로세서 레지스터로 복사됩니다.

2단계.
프로세서 내부에서 레지스터 변수가 1씩 증가합니다.

3단계.
변수 값이 프로세서에서 전역 메모리로 복사됩니다.

"와우! 그럼 모든 변수는 프로세서에서만 변경되는 건가요?"

"네."

"그리고 값은 앞뒤로 복사됩니다. 메모리에서 프로세서로 그리고 그 반대로?"

"네."

"휘발성 수정자는 변수 카운트에 액세스할 때 메모리에서 읽을 수 있도록 보장합니다(1단계). 그리고 스레드가 새 값을 할당하려는 경우 확실히 전역 메모리에 있을 것입니다(3단계)."

"하지만 Java 머신은 1단계와 3단계 사이에 스레드 전환이 없을 것이라고 보장하지 않습니다."

"그러면 변수를 1씩 증가시키는 것이 실제로는 3개의 작업입니까?"

"예."

"두 스레드가 동시에 count++를 실행하려는 경우 서로 간섭할 수 있습니까?"

"예, 확인해 보세요."

스레드 1 스레드 2 결과
register1 = count;
register1++;
count = register1;
register2 = count;
register2++;
count = register2;
register1 = count;
register2 = count;
register2++;
count = register2;
register1++;
count = register1;

"그러면 변수에 접근할 수 있지만 변경하는 것은 여전히 ​​위험합니까?"

"음, 변경할 수 있습니다. 조심하세요 ☺"

"어떻게?"

" 싱크로나이즈드  는 우리의 가장 친한 친구입니다."

"알겠어요."