[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.나는 당신을 비난. 지금은 내가 JCiP을 세분화 한, 후크 해요, 그리고 내가 작성한 코드가 맞다면 지금 궁금하네요. 코드 조각은 위의 사실, 잠재적으로 모순이다. (편집 :. 휘발성를 통해 안전 간행물에 아래 섹션 참조) 읽기 스레드는 무제한의 시간 (a와 b에 대한 기본 값이 있었다 무엇 이건,이 경우) 부실 볼 수 있었다. 당신은 일이-전에 가장자리를 소개하는 다음 중 하나를 수행 할 수 있습니다 :
나는 당신을 비난. 지금은 내가 JCiP을 세분화 한, 후크 해요, 그리고 내가 작성한 코드가 맞다면 지금 궁금하네요. 코드 조각은 위의 사실, 잠재적으로 모순이다. (편집 :. 휘발성를 통해 안전 간행물에 아래 섹션 참조) 읽기 스레드는 무제한의 시간 (a와 b에 대한 기본 값이 있었다 무엇 이건,이 경우) 부실 볼 수 있었다. 당신은 일이-전에 가장자리를 소개하는 다음 중 하나를 수행 할 수 있습니다 :
이 해결 쓰기 순서를 가져옵니다 (및 가시성 문제 해결). 그런 다음 새로운 theFoo 참조의 가시성을 해결해야합니다. 여기에, 휘발성이 적절한 - JCiP 섹션 3.1.4 "휘발성 변수"에서 말한다 (여기서, 변수는 theFoo입니다) :
-
==============================
2.최종 a와 b 필드 불변의 푸를 갖는 것은 기본 값으로 가시성 문제를 해결하지만, 너무 theFoo 휘발성을 않습니다.
최종 a와 b 필드 불변의 푸를 갖는 것은 기본 값으로 가시성 문제를 해결하지만, 너무 theFoo 휘발성을 않습니다.
개인적으로 나는 어쨌든 오용으로 그들은 더 힘들어 불변 값 클래스를 보내고 있습니다.
from https://stackoverflow.com/questions/3964317/memory-barriers-and-coding-style-over-a-java-vm by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 메서드 호출을 통해 요소를 나중에받을 수있는 소스를 만드는 방법? (0) | 2019.11.06 |
---|---|
[SCALA] 왜 개인 val`와`민간 최종 val` 다른`입니까? (0) | 2019.11.06 |
[SCALA] 스파크 스칼라에 DataFrame의 열 이름을 이름 바꾸기 (0) | 2019.11.06 |
[SCALA] 케이스 클래스는 스칼라에서지도로 (0) | 2019.11.06 |
[SCALA] 간단한 빌드 도구 (SBT)와 인 IntelliJ와 디버깅 스칼라 코드 (0) | 2019.11.06 |