멀티 스레딩 기본 사항 (A) - 자바 메모리 모델

  더 나은 자바 내부 모델을 이해하기 위해서, 우리는 단순히 CPU의 캐시 모델을 기억해야합니다.

CPU 캐시 캐시

  컴퓨터에서 CPU의 연산 속도는 빠르게 계산하지만,하지만, 컴퓨터 작업의 대부분을 완료 할 수있는 CPU에 의존 할 수 없다. 또한 메모리 소자의 계산 결과 등을, 내부 층과 상호 작용 데이터를 포함하는, 판독 및 기록 할 필요가있다. 그러나, 컴퓨터의 기억 장치와 CPU의 동작 속도 차이로 인해이 수십배 있으며, 현대의 컴퓨터는 일반적으로 판독 사이의 층을 추가 가능한 가까이 조작의 CPU 처리 속도 CPU 캐시로의 메모리 디바이스의 속도를 작성 그 동작은 메인 메모리에 캐시 플러쉬 동작 종료 후 빠르게 수행 할 수 있도록 캐시에 필요한 데이터를 복사하므로 판독 느린 CPU 기다린 내층을 쓸 필요가 없다.

  모순 프로세서 속도와 메모리에 좋은 솔루션의 스토리지 캐시 상호 작용하지만, 그러나 그것은 또한 새로운 모순 소개 : 메모리 일관성 문제. 다중 프로세서 컴퓨팅 작업이있는 메인 메모리 영역의 동일한 조각하는 경우는, 메모리 일관성 문제가 발생할 이러한 문제를 해결하기 위해 할 때마다 프로세서 캐시는 데이터 일관성을 유지하기 위해 몇 가지 규칙을 따라야합니다 액세스 . 이 규칙은 일관성 프로토콜을 캐시하는 전문가를 이름이 지정됩니다. 가장 유명한 중 하나는 인텔 MESI 프로토콜입니다. MESI 프로토콜은 각 공유 변수의 일관성 캐시 사본에 사용 된 것을 확인합니다. 일반 아이디어는 : 캐시에 CPU 운전 데이터 중,이 변수가 그 때 다음을 수행 할 다른 캐시에있는 변수의 복사본이 있음을 의미 공유 변수이라고 발견 된 경우 :

    1) 판독 동작, 어떤 처리없이 직접 CPU의 레지스터 캐시의 데이터를 판독 할 수있다;

    2) 기록 동작의 다른 캐시,이 변수의 복사본이 변수가 판독 될 경우, 방치 된 신호 것은 메인 메모리에 새로운 값을 판독한다.

  캐시의 증가뿐만 아니라, 내부 계산 유닛을위한 프로세서가 완전히 최대한 이용 될 수있는 코드의 실행의 논리 시퀀스의 코드로 계산 결과의 전체 결과가 있음을 보장하면서, 순서대로 실행 코드를 입력 할 수있는 프로세서는, 최적화 일관된. 주문 실행 및 이와 유사한 CPU의 최적화 중, Java 가상 머신의 시간 컴파일러는 유사한 명령 재정렬 (명령 재정렬) 최적화 있습니다.

자바 메모리 모델

  자바 메모리 모델 (자바 메모리 모델, JMM)은 자바 가상 머신의 상호 작용 정보가 컴퓨터의 메인 메모리 작업을 정의합니다. 즉, 변수 JVM에 저장되고 메모리에 이러한 변화 메모리의 로우 레벨 세부 제거. 여기서 변수, 즉, 데이터가 공유 될 수있는 인스턴스 필드 정적 필드 및 오브젝트의 배열을 포함한다. 그들은 개인 실하고 공유되지 않기 때문에, 더 경쟁이 존재하지 않는이있을 것입니다, 지역 변수와 메소드의 인수를 포함하지 않습니다. 다음과 같이 JMM은 스레드와 메인 메모리 사이의 추상적 인 관계를 정의합니다 :

  1) 변수에 저장하고 메인 메모리를 공유하는, 각각의 스레드가 액세스 할 수있는 메인 CPU의 캐쉬 메모리는 메인 메모리의 모델을 비교할 수있는, 그러나 여기에 가상 컴퓨터 메모리의 일부이다.

  2) 각 스레드는 CPU 캐시 모델은 캐시에 비교 될 수있다, 로컬 메모리라는 자체 전용 메모리를 가지고있다.

  3) 작업 메모리는 공유 변수 스레드의 사본을 저장할 수있다.

  4) 워크 메모리에서 수행되는 변수 (읽기 쓰기)의 모든 동작들을 스레드 주기억 직접 조작 변수가 될 수 없다.

  5) 바로 다른 변수의 작업 메모리에 액세스 할 수있는 다른 스레드 간의 스레드간에 전달 된 변수 값은 메인 메모리를 완료해야한다.

  우리의 미래 멀티 스레드, 누워있는 기초 valatile 키워드에 대해 배울 수있는 자바 메모리 모델을 알아보세요.

 

  동시 프로그래밍에서 세 가지 중요한 특성, 즉 자성, 주문 및 가시성이있다. 우리는 JMM에게이 세 가지 특성을 확인하는 방법을 살펴.

JMM와 자성

  자성은 모든 단계가, 하나의 작업에 포함 된 모든 전체 실행 실행 여부 중 하나를 의미합니다. 이 개념은 사물의 관계형 데이터베이스 일관성에 비교 될 수있다.

Java에서는, 기본 데이터 타입과 참조 형 변수를 읽기가 할당 원자이다. 그러나, 몇 가지 동작은 반드시 원자가 아닌 함께 원자 조성이다. 예를 들어, 일반적인 증가 연산자 다음 : 

및 ++

  이 문은 실제로 세 가지 작업의 조합에서 이루어집니다 :

  1) 스레드 (Y)의 값을 판독하여 실행한다 (Y 경우, 현재 스레드의 작업 메모리에 저장된 카피 된 메인 메모리로부터 스레드의 실행을 직접적으로 취득)의 작업 메모리에 이미 복사;

  2) (Y)의 실행 스레드를 플러스하는 조작을 수행;

  3) 리프레쉬 주기억 (Y)의 값.

  JMM은 기본적인 읽기와 원자 할당을 보장, 다른 하나는 당신이 어떤 코드 자성을 받기를 원한다면, 당신은 나중에 배울 동기화 된 키워드를 사용하거나 JUC 잠금에서 수 보장하지 않습니다.

 

JMM 및 가시성

  가시성는 공유 변수에 대한 프로그램 수정에, 다른 스레드는 즉시 변화를 알 수 있습니다 의미합니다. 변수 값에 새로운 변수 전에 다시 메인 메모리에 새로운 동기화 후 변수 값을 수정하여 JMM 그러한 시인성을 달성하기 위해 메인 메모리 의존적 전사 매체로서의 브러시 메인 메모리로부터 판독된다. 자바는 질서를 보장하기 위해 여러 가지 방법을 제공합니다 :

  1) 변수가 휘발성 수정 될 때, 직접 메인 메모리에 (물론, 작업 메모리로 플러시됩니다)입니다 공유 리소스에 작업을 읽어 휘발성 키워드를 사용하여 쓰기 작업의 공유 자원이 첫번째 작업 기억 수정합니다, 값은 즉시 메인 메모리로 플러시된다.

  2) 동기화 키워드의 사용은, 동기화 된 키워드가 동시에 하나의 스레드가 로크를 획득되도록하고 동기화 방법에있어서, 작동하는 공유 변수를 수행한다. 그리고 잠금이 해제되기 전에, 메인 메모리에 플러시 변수를 변경하는 것을 보장합니다.

  3) 경량 동기화 된 키워드에 비해 역할과 동기화 된 키워드와 유사 JUC 제공 명시 적 잠금 잠금을 사용하지만.

 

JMM 및 주문

  JMM에서 주문 실행 및 명령어 재정렬 최적화 최적화 밖으로 CPU 캐시 컴파일러 및 CPU 지시 재정렬, 즉 스트레스를 허용한다. 단일 스레드 경우, 어떤 당신은 멀티 스레딩, 명령 재정렬이 오류가 발생할 수 있습니다 방법, 아무런 문제가 있지만, 최적화 할 수 있습니다. 동기화의 표시하면 (사실, 나는 기본 동기화가 사용된다는 의미입니다 생각) 순서로 물건을 유지할 수 있습니다 의미없이 JMM은 일부 자연 순서 규칙이이 규칙은 어떻게됩니까-이전과 같은 원리이며,

  절차의 규칙을 시작 트레드 스레드의 작업을하기 전에 방법을 시작, 스레드는 정말 그렇지 않으면 그냥 객체이다, 시작 후 실행할 수 있습니다.

  규칙의 끝 객체 : 제 1 목적 초기화의 완성은 fanalize 방법 전에 발생합니다.

  차단 규칙 제 1 잠금 해제 작업이 잠금 자물쇠의 운영에서 발생합니다.

  传递规则:Happens-before 原则具有传递性。

如果一个操作无法从 Happens-before 原则推导出来,那么就无法保证有序性。

  与保证可见性一样,也可以使用 volatile 关键字、synchronized 关键字、JUC 提供的显式锁lock来保证有序性。其中 synchronized 保证有序性是利用“同一时间只有一个线程获得锁,然后执行同步方法,对共享变量进行操作”的这一特点来保证有序性;而 volatile 则直接暴力的禁止编译器和 CPU 的任何指令重排序,因此保证了有序性。

 

  在了解了 JMM 模型之后可以更方便学习多线程知识,特别是在后面学习 volatile 关键字的时候就会显得得心应手。

 

추천

출처www.cnblogs.com/dogeLife/p/11391863.html