자바 병렬 프로그래밍 실전 - 제3장 대상의 공유
3369 단어 Java 동시 프로그래밍 실전
가시성 표시(Memory Visibility)란 읽기 작업의 스레드에서 다른 스레드가 쓴 값을 볼 수 있음을 의미합니다.가시성을 확인하려면 동기화를 사용해야 합니다.(동기화되지 않은 조건에서 컴파일러, 프로세서, 실행할 때 작업의 실행 순서를 다시 정렬할 수 있다)
실효 데이터: 동기화되지 않은 프로그램에서 실효 데이터가 발생할 수 있습니다.
비원자 64비트 작업: Java 메모리 모델에서는 변수의 읽기 또는 쓰기가 원자여야 합니다.그러나 volatile이 아닌 64비트의 롱과 더블, JVM은 64비트의 읽거나 쓰기를 두 32비트로 분해할 수 있다.다중 루틴 프로그램에서 공유되고 가변적인 롱과 더블 변수를 사용하는 것은 안전하지 않습니다. 키워드volatile로 보호자나 자물쇠를 설명해야 합니다.
자물쇠 추가와 가시성: 자물쇠 추가는 한 라인이 예측 가능한 방식으로 다른 라인의 실행 결과를 볼 수 있도록 보장할 수 있다. 동기화 코드 블록과 동기화 방법은 원자적인 방식으로 조작을 실행할 수 있을 뿐만 아니라동기화는 메모리의 가시성을 확보할 수 있다.
volatile 변수: 다음 조건을 모두 충족하는 경우에만volatile 변수를 사용해야 합니다.
스레드 닫기(Thread Confinement)는 가변 데이터를 공유하지 않지만 스레드에 닫힌 객체가 스레드에서 빠져나오지 않도록 합니다.
개체가 작성된 후 상태를 수정할 수 없는 경우 개체는 불변 개체입니다.불변 대상은 라인이 안전하고 동기화가 필요 없으며 임의로 발표할 수 있습니다.불변 객체는 다음 조건을 충족해야 합니다.
예: 아래의 Person 대상은 변할 수 없습니다. (clone () 방법을 사용했고birthday 변수가 발표되지 않았습니다.)
public class Person {
private final String id;
private final String name;
private final Date birthday;
public Person(String id, String name, Date birthday) {
this.id = id;
this.name = name;
this.birthday = (Date)birthday.clone();
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public Date getBirthday() {
return (Date)birthday.clone();
}
}
보안 게시 소프트 객체는 보안 게시를 통해 게시되어야 합니다. 일반 모드:
객체의 게시 요구사항은 객체의 가변성에 따라 달라집니다.
병렬 프로그램에서 대상을 사용하고 공유할 때 실용적인 정책