복붙노트

[SCALA] 자바 VM을 통해 메모리 장벽 및 코딩 스타일

SCALA

자바 VM을 통해 메모리 장벽 및 코딩 스타일

나는 정기적으로 스레드 풀에 의해 업데이트되는 정적 복잡한 객체를 가지고 있고, 장기 실행 스레드에서 더 많거나 적은 지속적으로 읽어 가정하자. 개체 자체는 항상 불변 무언가의 최신 상태를 반영합니다.

class Foo() { int a, b; }
static Foo theFoo;
void updateFoo(int newA, int newB) {
  f = new Foo();
  f.a = newA;
  f.b = newB;
  // HERE
  theFoo = f;
}
void readFoo() {
  Foo f = theFoo;
  // use f...
}

내 독자가 오래되거나 새로운 푸를보고 있는지 나는 그러나 나는 완전히 초기화 객체를 참조 할 필요가 조금도 상관하지 않습니다. IIUC는 자바 스펙은 여기에 메모리 장벽없이, 내가 초기화 f.b와 객체를 볼 수 있지만 메모리에 아직 커밋 f.a하지 말한다. 내 프로그램은 조만간 메모리에 물건을 저지하는 실제 프로그램입니다, 그래서 나는 (그것을 해치지 않을 것입니다하지만) 실제로 바로 메모리에 theFoo의 새 값을 커밋 할 필요가 없습니다.

메모리 장벽을 구현하는 가장 읽을 수있는 방법은 무엇이라고 생각하십니까? 나는 필요가있을 경우 가독성을 위해 약간의 성능 가격을 지불 할 용입니다. 난 그냥 푸에 할당을 동기화 할 수 있습니다 생각하고 그 작동,하지만 나는 내가 그렇게 할 이유 코드를 읽는 사람에게 매우 분명 확실하지 않다. 나는 또한 새로운 푸의 전체 초기화를 동기화 할 수 있지만 실제로 필요한 더 많은 잠금을 소개한다.

그것은 가능한 읽을 수 있어요 그래서 어떻게 당신이 그것을 작성합니다? 스칼라 버전에 대한 보너스 명성 :)

해결법

  1. ==============================

    1.나는 당신을 비난. 지금은 내가 JCiP을 세분화 한, 후크 해요, 그리고 내가 작성한 코드가 맞다면 지금 궁금하네요. 코드 조각은 위의 사실, 잠재적으로 모순이다. (편집 :. 휘발성를 통해 안전 간행물에 아래 섹션 참조) 읽기 스레드는 무제한의 시간 (a와 b에 대한 기본 값이 있었다 무엇 이건,이 경우) 부실 볼 수 있었다. 당신은 일이-전에 가장자리를 소개하는 다음 중 하나를 수행 할 수 있습니다 :

    나는 당신을 비난. 지금은 내가 JCiP을 세분화 한, 후크 해요, 그리고 내가 작성한 코드가 맞다면 지금 궁금하네요. 코드 조각은 위의 사실, 잠재적으로 모순이다. (편집 :. 휘발성를 통해 안전 간행물에 아래 섹션 참조) 읽기 스레드는 무제한의 시간 (a와 b에 대한 기본 값이 있었다 무엇 이건,이 경우) 부실 볼 수 있었다. 당신은 일이-전에 가장자리를 소개하는 다음 중 하나를 수행 할 수 있습니다 :

    이 해결 쓰기 순서를 가져옵니다 (및 가시성 문제 해결). 그런 다음 새로운 theFoo 참조의 가시성을 해결해야합니다. 여기에, 휘발성이 적절한 - JCiP 섹션 3.1.4 "휘발성 변수"에서 말한다 (여기서, 변수는 theFoo입니다) :

  2. ==============================

    2.최종 a와 b 필드 불변의 푸를 갖는 것은 기본 값으로 가시성 문제를 해결하지만, 너무 theFoo 휘발성을 않습니다.

    최종 a와 b 필드 불변의 푸를 갖는 것은 기본 값으로 가시성 문제를 해결하지만, 너무 theFoo 휘발성을 않습니다.

    개인적으로 나는 어쨌든 오용으로 그들은 더 힘들어 불변 값 클래스를 보내고 있습니다.

  3. from https://stackoverflow.com/questions/3964317/memory-barriers-and-coding-style-over-a-java-vm by cc-by-sa and MIT license