방법을 이해하려고 노력하는 동안 SubmissionPublisher
( 자바 SE (10), 오픈 JDK 소스 코드 | 문서 ), 버전 9에서 자바 SE에 추가 된 새로운 클래스가 구현 된, 나는에 몇 가지 API 호출을 우연히 발견 VarHandle
나는 이전에 인식되지 않았습니다 :
fullFence
, acquireFence
, releaseFence
, loadLoadFence
와 storeStoreFence
.
특히 기억 장벽 / 울타리의 개념에 관한 연구를 한 후에 (나는 이전에 들어 보았지만 결코 사용하지 않았으므로 의미에 익숙하지 않았습니다), 나는 그들이 무엇을위한 것인지에 대한 기본적인 이해가 있다고 생각합니다. . 그럼에도 불구하고 내 질문이 오해에서 생길 수 있으므로 처음부터 올바르게 이해하고 싶습니다.
메모리 장벽은 읽기 및 쓰기 작업과 관련하여 재정렬 제약 조건입니다.
메모리 배리어는 읽기 또는 쓰기 중 하나 또는 둘 다에 대한 제약 조건을 설정했는지에 따라 단방향 및 양방향 메모리 배리어의 두 가지 주요 범주로 분류 할 수 있습니다.
C ++는 다양한 메모리 장벽을 지원 하지만 이것들이 제공하는 것과는 일치하지 않습니다
VarHandle
. 그러나 사용 가능한 일부 메모리 장벽 은 해당 C ++ 메모리 장벽 과 호환되는 순서 효과 를VarHandle
제공 합니다.#fullFence
호환atomic_thread_fence(memory_order_seq_cst)
#acquireFence
호환atomic_thread_fence(memory_order_acquire)
#releaseFence
호환atomic_thread_fence(memory_order_release)
#loadLoadFence
와#storeStoreFence
호환되는 C ++ 카운터 부분이 없다
호환 이라는 단어 는 여기서 의미론이 세부 사항과 관련하여 분명히 다르기 때문에 여기서 중요한 것으로 보입니다. 예를 들어, 모든 C ++ 장벽은 양방향이지만 Java의 장벽은 (필요하지는 않습니다).
- 대부분의 메모리 장벽에는 동기화 효과가 있습니다. 이는 특히 사용 된 배리어 유형과 다른 스레드에서 이전에 실행 된 배리어 명령에 따라 다릅니다. 장벽 명령어가 하드웨어에 특정한 의미를 갖기 때문에 더 높은 수준 (C ++) 장벽을 고수하겠습니다. 예를 들어 C ++에서 릴리스 장벽 명령어 이전에 작성된 변경 사항은 획득을 실행하는 스레드에서 볼 수 있습니다. 명령을 .
내 가정이 맞습니까? 그렇다면 결과 질문은 다음과 같습니다.
사용 가능한 메모리 장벽을
VarHandle
이 어떤 종류의 메모리 동기화 유발합니까?메모리 동기화를 유발하는지 여부에 관계없이 Java에서 재정렬 제약 조건이 유용한 것은 무엇입니까? Java 메모리 모델은 휘발성 필드, 잠금 또는 다음
VarHandle
과 같은 작업의 순서와 관련하여 이미 매우 강력한 보증을 제공합니다.#compareAndSet
이 관련된 .
예를 찾고있는 경우 : 위에서 언급 한 BufferedSubscription
내부 클래스 SubmissionPublisher
(위의 링크 된 소스)는 1079 줄에 완전한 울타리를 설정했습니다 (함수 growAndAdd
; 링크 된 웹 사이트는 조각 식별자를 지원하지 않으므로 CTRL + F 만 사용하십시오) ). 그러나 그것이 무엇인지 불분명합니다.
plain -> opaque -> release/acquire -> volatile (sequential consistency)
..