방법을 이해하려고 노력하는 동안 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)..