자바 병렬 프로그래밍 실전 - 제3장 대상의 공유

어떻게 대상을 공유하고 발표합니까?
가시성 표시(Memory Visibility)란 읽기 작업의 스레드에서 다른 스레드가 쓴 값을 볼 수 있음을 의미합니다.가시성을 확인하려면 동기화를 사용해야 합니다.(동기화되지 않은 조건에서 컴파일러, 프로세서, 실행할 때 작업의 실행 순서를 다시 정렬할 수 있다)
실효 데이터: 동기화되지 않은 프로그램에서 실효 데이터가 발생할 수 있습니다.
비원자 64비트 작업: Java 메모리 모델에서는 변수의 읽기 또는 쓰기가 원자여야 합니다.그러나 volatile이 아닌 64비트의 롱과 더블, JVM은 64비트의 읽거나 쓰기를 두 32비트로 분해할 수 있다.다중 루틴 프로그램에서 공유되고 가변적인 롱과 더블 변수를 사용하는 것은 안전하지 않습니다. 키워드volatile로 보호자나 자물쇠를 설명해야 합니다.
자물쇠 추가와 가시성: 자물쇠 추가는 한 라인이 예측 가능한 방식으로 다른 라인의 실행 결과를 볼 수 있도록 보장할 수 있다. 동기화 코드 블록과 동기화 방법은 원자적인 방식으로 조작을 실행할 수 있을 뿐만 아니라동기화는 메모리의 가시성을 확보할 수 있다.
volatile 변수: 다음 조건을 모두 충족하는 경우에만volatile 변수를 사용해야 합니다.
  • 변수에 대한 쓰기 작업은 변수의 현재 값에 의존하지 않거나 단일 라인만 변수의 값을 업데이트할 수 있도록 확보한다.
  • 이 변수는 다른 상태 변수와 함께 불변성 조건에 포함되지 않는다.
  • 변수에 액세스할 때 잠금 해제
  • 게시 및 게시(Publish) 객체는 현재 역할 영역 외부의 코드에서 사용할 수 있는 객체입니다.만약 비공식적인 방법이 인용을 되돌려주거나 다른 종류로 인용을 전달하는 방법이 있다면, 이 인용의 대상은 모두 발표될 것이다.게시하지 말아야 할 대상이 발표되었는데, 일출 (Escape) 은 구조 과정에서 this를 인용하여 발표하지 말라고 한다.
    스레드 닫기(Thread Confinement)는 가변 데이터를 공유하지 않지만 스레드에 닫힌 객체가 스레드에서 빠져나오지 않도록 합니다.
  • Ad-hoc 스레드 폐쇄
  • 창고 폐쇄(국부 변수)
  • ThreadLocal

  • 개체가 작성된 후 상태를 수정할 수 없는 경우 개체는 불변 개체입니다.불변 대상은 라인이 안전하고 동기화가 필요 없으며 임의로 발표할 수 있습니다.불변 객체는 다음 조건을 충족해야 합니다.
  • 객체가 작성된 후에는 상태를 수정할 수 없습니다.
  • 대상의 모든 영역은final 유형입니다.
  • 대상은 정확하게 만들어졌습니다(대상 생성 과정에서this 인용이 나오지 않았습니다).

  • 예: 아래의 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();
        }
    }

    보안 게시 소프트 객체는 보안 게시를 통해 게시되어야 합니다. 일반 모드:
  • 정적 초기화 함수에서 대상 인용을 초기화합니다.
  • 객체의 참조를volatil e도메인 또는 AtomicReference 객체에 저장합니다.
  • 대상의 인용을 정확한 구조 대상의final 유형역에 저장합니다.
  • 보안 컨테이너 Hashtable, ConcurrentMap과 같이 객체에 대한 참조를 잠금 보호 도메인에 저장합니다.

  • 객체의 게시 요구사항은 객체의 가변성에 따라 달라집니다.
  • 불변 객체는 임의의 메커니즘으로 게시할 수 있습니다.
  • 사실불변 대상은 반드시 안전 방식을 통해 발표해야 한다.
  • 가변 대상은 반드시 안전한 방식으로 발표해야 하며, 라인이 안전하거나 특정한 자물쇠로 보호되어야 한다(방문 대상의 상태는 동기화된다).

  • 병렬 프로그램에서 대상을 사용하고 공유할 때 실용적인 정책
  • 스레드 폐쇄
  • 읽기 전용 공유(변경 불가 및 사실 변경 불가 포함)
  • 스레드 보안 공유(대상 내부 동기화)
  • 보호 대상(예를 들어 동기화 용기에 넣기)
  • 좋은 웹페이지 즐겨찾기