공유 객체 "자바 동시성의 전투"를

머리말

  블로그의이 시리즈는이 주로 다음과 같은 내용에, 함량이 지루한 것, 여기에 요약 ", 전투에서 자바 동시성"조금. 당신은, 하, 하, 특정 주제 영역에서 사용되는 용어 (용어)을 설명 할 다음은, 우리 나라에서, 개념의 컬렉션의 제목을 나타냅니다 또한 명사 또는 기술로 알려진, 즉 전문 용어이다, 결국 그것이 무엇을 의미하는지 제목 직관적 인 느낌을 볼 수 없을 수도 있습니다 명사 (명사 문법 다르다). 이 용어는 계약 또는 음성 또는 텍스트로 과학적 개념의 제한된 언어 기호를 표현하는 데 사용됩니다, 아이디어와 지식 도구의 교환이다. 나는이 조건에 따라 당신에게 설명 특유을 사용합니다.

스레드로부터의 안전성

  스레드 안전은 무엇인가? 이것은 일반적인 문제, 우리가 스레드 안전 정의에 인터뷰하는 과정에서 발생했습니다 생각으로 간주, 핵심 개념은 정확성 스레드 안전의 정의가 퍼지 경우, 그래서 적절한의 부족이며, 명확하게 성격을 정의했다. 정확성 의미는, 그 동작 사양의 클래스는 정확히 일반적으로 객체의 상태를 제한하는 잘 불변 사양의 다양한 조건을 정의하고, 다양한 정의의 결과는 실험 조건은 객체의 동작을 설명했다. 그것은 클래스 또는 멀티 스레드 환경 중 하나는 단일 스레드 환경에서 정확하게 수행 될 수 있다는 것을 의미하고,이 클래스는 스레드 안전하다. 대체 실행 스레드 중 원인 예상치 못한 결과 경우, 스레드 안전하지 않습니다.

시계

  변수가 있다면, 지금 읽기 및 쓰기 작업을하고, 가시성 말 현재 스레드 변수 쓰기 작업이 다른 스레드에 볼 수있다, 다른 스레드가이 변수를 변경 한 것을 알 수 없습니다. 당신이 볼 수 보장 할 수없는 경우, 당신은 동기화 메커니즘을 사용해야합니다. 다른 스레드가이 변수를 읽을 때 그렇지 않으면, 값에 오류가 발생할 수 있습니다. 이 값은 유효하지 않은 데이터라고합니다.
  JVM은 64 비트 읽기 또는 두 개의 32 비트 동작으로 기록 동작, 비 휘발성 긴 가변 타입을 읽을 때, 동작이 판독 인 경우 쓸 수 있도록 길고 두 변수의 비 휘발성 유형의 여기시킨다 다른 스레드에서 실행되는 경우, 그때는하지 (32)의 로우 (32)의 높은 값과 다른 값을 읽기 때문에, 멀티 스레드 환경에서 공유 변수 길고 두 변수의 다른 유형을 사용할 수있다 휘발성 키워드를 선언하지 않는 한 안전은, 또는 잠금으로 보호.

  1. 지금 휘발성 소개 : Java 언어는 보장하기 위해 약한 동기화 메커니즘, 즉 휘발성 유형을 제공하는 다른 스레드에 업데이트 알림 변수. 사용 휘발성 추가 변수 앞에 있습니다. JMM에서 공유 메모리를 사용하는 스레드 간 통신을 달성한다. 휘발성 메모리 의미 :
  • 휘발성 변수를 쓸 때, JMM 즉시 메인 메모리로 플러시, 스레드, 로컬 메모리 공유 변수 값에 해당 할 것이다.
  • 휘발성 변수를 읽을 때, 스레드되지 않습니다 로컬 메모리를 해당 JMM 것이다, 공유 변수는 메인 메모리에서 직접 읽습니다.
  1. 사용의 휘발성 조건 :
  • 변수에 기록 변수의 현재 값에 의존하지 않는, 또는 당신은 하나의 스레드가 변수의 값을 업데이트 할 것을 보장 할 수 있습니다.
  • 이 변수는 다른 상태 변수와 함께 불변 조건을 포함되지 않습니다.
  • 변수를 액세스 할 때 고정 할 필요가 없습니다.

加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,千万不要用它来确保原子性操作。

릴리스 및 탈출

객체는 객체가 객체에 액세스하거나 비 전용 방법 중 하나에 복귀 할 수있는 다른 기준 코드에 저장되는 시점에, 예를 들면, 현재 범위 외부 코드에서 사용할 수 있음을 의미 게시 참조 또는 다른 종류의 전송 처리에 대한 참조. 객체가 출시 된 공표하지 않아야 할 때,이 탈출이라고합니다.

스레드 폐쇄

변수 데이터에 액세스 할 때 동기화를 사용하는 것이 필요 공유. 동기 방식의 사용을 피할 수있는 한 가지 방법은 스레드 안전 쉬운 방법의 구현입니다, 단일 스레드 데이터 액세스에, 동기화가 필요하지 않은 경우,이 기술은 스레드가 폐쇄라고, 다른 공유 데이터입니다. 몇 가지 배관 밀봉 기술이다.

  1. 임시 스레드 폐쇄

    스레드 폐쇄 수단 애드혹, 프로그램의 유지 보수 스레드 폐쇄가 부담하는 모든 책임을 달성했다. 예 공개 개질제 또는 로컬 변수를 들어, 타겟 스레드에 개폐 가능한 개체. 사실, 스레드 객체는 일반적으로 공유 변수에 저장됩니다 마감했다. 애드혹 스레드 폐쇄는 매우 깨지기 쉬운, 그래서 프로그램은 (의 ThreadLocal을 스택을 폐쇄) 다음과 같은 두 가지 기술을 사용할 수 있습니다, 덜 사용하게 할 수 있습니다.

  2. 스택 폐쇄

    또한 내부 스레드 또는 스레드 로컬 사용으로 알려진 스택 폐쇄는 애드혹 유지 관리가 용이하고,보다 강력한보다, ThredaLocal와 혼동하지. 폐쇄 스택에서, 객체는 로컬 변수가 액세스 될 수있다.

//伪代码
public void test(){
//定义一个变量
Set set ;
// 实例化一个TreeSet对象,并将该对象的一个引用保存到set中。
set = new TreeSet();
}
复制代码

이러한 TreeSet의 개체가 로컬 변수로 묶여, 또한 스레드 스택을 실행하기에있는 실행 스레드, 부근에, 다른 스레드 스택에 액세스 할 수있다.

  1. ThreadLocal를

    밀폐 실을 유지하는 방법이 제공 ThreadLocal를 얻을이고 액세스 인터페이스 또는 방법과 같은 설정, 더 표준화 된 사용의 ThreadLocal가이 클래스와 같은 쓰레드에 기억 된 값과 값을 연관시킬 수있다 그래서 항상 얻을 변수 스레드가 별도의 사본의 각 사용은 현재 스레드 실행 설정에서 설정 한 최신 값을 반환합니다. ThreadLocal를 일반적으로 이미지를 공유 변수 나 전역 변수의 하나의 인스턴스를 방지하기 위해 사용된다.

   //保存一个数据库连接对像
   public static ThreadLocal<Connection> connectionThreadLocal = 
   new ThreadLocal<Connection>(){
       @Override
       protected Connection initialValue() {
           return DriverManager.getConnection(DB_URl);
       }
   };
   //每个线程使用时直接get
   public static Connection getConnection(){
       return connectionThreadLocal.get();
   }
复制代码

불변

이 생성 된 후에는 변경 될 수없는 상태로의 일 경우, 오브젝트는 불변 스레드 안전 성 오브젝트를 변경하지 않는 고유 한 특성이다. 조건에 대해 만족하는 경우, 객체는 불변입니다 :

  • 개체를 만든 후 그 상태를 변경할 수 없습니다.
  • 모든 필드는 객체의 최종 유형입니다.
  • 개체가 올바르게 작성되어 (오브젝트의 작성 중에,이 참조 탈출 없음)

최종 필드 : 불변의 객체에 대한 구성. 필드의 최종 형태는 변경 될 수 없다 (그러나 마지막 필드에 의해 참조 된 오브젝트가 가변적 인 경우, 이들 참조는 객체 변형 될 수있다). 그러나, 자바 메모리 모델에서, 최종 필드뿐만 아니라 특별한 의미. 최종 현장 안전 초기화 처리하여 무제한 액세스 불변의 객체를 확보 할 수 있으며, 이러한 공유 객체를 동기화 할 필요가 없습니다.

보안 자료

  1. 개체에 대한 보안 객체 참조를 게시하려면 및 개체의 상태가 다른 스레드를 볼 수 있어야 제대로 구성 개체를 안전하게 다음과 같은 방법으로 방출 될 수있다 :
  • 정적 초기화 함수 객체 참조를 초기화한다.
  • 목표물은 필드 또는 Atomicreferance 개체 유형 휘발성 저장된다.
  • 객체에 대한 참조가 제대로 구성 객체 마지막 유형 필드에 저장.
  • 개체 참조가 잠금으로 보호 도메인에 저장됩니다.
  1. 사용 및 동시 프로그램에서 객체를 공유 할 때, 당신은 몇 가지 구체적인 전략을 사용할 수 있습니다 :
  • 스레드 종료 스레드 개체 만 개체가이 스레드에 묶여 스레드에 의해 소유 할 수 폐쇄 만이 스레드에 의해 수정 될 수있다 :
  • 읽기 전용 공유 : 추가 동기화없이 공유 객체는 여러 스레드에 의해서만 동시 액세스를 읽을 수 있지만, 어떤 스레드가 읽기 전용 공유 객체는 객체와 불변의 사실 불변의 객체를 포함, 수정할 수 없습니다.
  • 공유 스레드 안전 : 내부 동기화 스레드 안전 개체, 그래서 여러 스레드가 더 동기화없이 객체의 공용 인터페이스를 통해 액세스 할 수 있습니다.
  • 보호의 객체 : 보호 오브젝트 만 특정 보유하는 잠금을 통해 액세스 할 수 있으며, 스레드 안전 개체 포장 객체를 포함하여 다른 개체의 보호 및 개체가 게시하고 특정 잠금 장치에 의해 보호.

하드 시점 후에는 초점 포인트 오처럼 볼 수 있습니다! 프로필보기는 더 블로그 아있다. 잘못된 경우에, 저를 수정하시기 바랍니다. 함께 AC 플러스 이익 집단.

추천

출처juejin.im/post/5d58d81551882521872b97e3