>Java >java지도 시간 >Java의 \'Happens-Before\' 일관성은 무엇이며 어떻게 작동합니까?

Java의 \'Happens-Before\' 일관성은 무엇이며 어떻게 작동합니까?

DDD
DDD원래의
2024-10-31 16:41:30498검색

What is

일관성 전 발생 이해

JLS(Java 언어 사양)의 일관성 전 발생 개념은 멀티스레드 환경에서 읽고 씁니다.

일관성 전 발생의 정의

모든 읽기 r에 대해 일련의 작업 A가 일관되기 전에 발생합니다. A에서 W(r)는 r이 본 쓰기 작업입니다.

  • hb(r, W(r)) (r이 W(r) 이전에 발생함)
  • 또는 A에는 w.v = r.v이고 hb(W(r), w)와 hb(w, r) 모두인 쓰기 w가 없습니다(r과 w 사이에 불일치가 없습니다)

질문답변

1. 당신의 이해가 맞습니까?
예, 당신의 이해가 정확합니다. "다음 단어와 같습니다: ..., ...도 ...도 아닌 경우입니다."는 형식적 정의와 논리적으로 동일합니다.

2. "w.v = r.v"는 무엇을 의미하나요?
w.v와 r.v는 각각 쓰기 w와 읽기 r에 의해 액세스되는 변수의 값을 나타냅니다. w.v = r.v 조건은 두 작업에서 읽은 값이 동일하다는 의미입니다.

3. 실행 순서에서 왼쪽 숫자는 무엇을 의미하나요?
왼쪽 숫자는 원본 코드의 동작 순서를 나타냅니다.

4. 휘발성 필드에 대한 이해가 정확합니까?
예, 이해가 정확합니다. 첫 번째 실행 순서에서는 A와 B가 비휘발성 필드이기 때문에 r2와 r1 모두 초기 쓰기가 0으로 표시되어 지연되거나 일관되지 않은 읽기가 가능합니다.

5. 상황(나중에 발생하는 읽기 및 쓰기 참조)이 현실 세계에 존재합니까?
예, 존재할 수 있습니다. 한 가지 예는 두 스레드가 자체 레지스터를 통해 공유 데이터에 액세스하고 최적화로 인해 읽기 스레드가 쓰기 스레드의 변경 사항을 감지하지 못하는 경우입니다.

6. 실제 예를 들어주시겠습니까?
다음 예를 고려해 보세요.

스레드 1

<code class="java">volatile boolean running = true;</code>

스레드 2

<code class="java">while (running) {
  // Perform task
}</code>

이 예에서 읽기 스레드의 최적화로 인해 업데이트된 실행 값을 로드할 수 없는 경우 스레드 1이 이미 실행을 다음으로 설정했더라도 계속해서 오래된 값을 확인하고 루프를 무기한 실행합니다. 거짓입니다.

위 내용은 Java의 'Happens-Before' 일관성은 무엇이며 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.