자바 가상 기계 학습 - 메모리 모델 및 스레드

자바 가상 기계 학습 - 메모리 모델 및 스레드

첫째, 왜

  Java 가상 머신 사양은 일관된 메모리를 달성하기 위해 다양한 플랫폼에서 Java 프로그램을하게 달성하기 위해, 메모리 액세스의 다양한 하드웨어 및 운영 체제의 차이를 보호하기 위해 자바 메모리 모델 (자바 메모리 모델, JMM)를 정의하려고 시도 액세스 메모리 효과.

 

 

둘째, 메인 메모리 및 작업 메모리

   자바 메모리 모델의 주된 목적은 가상 머신 잭팟 변수 메모리 변수와 메모리와 같은 낮은 수준의 상세에 저장되고 삭제 된 각 변수에 대한 프로그램 액세스 규칙을 정의하는 것이다.

  자바 메모리 모델은 모든 변수가 메인 메모리 (메인 메모리), 각 스레드는 작업 메모리에 있어야합니다 (등 읽기, 과제,) 변수에 대한 모든 작업을 스레드 자신의 작업 메모리 (작업 기억)가 저장되도록 지정 실시 직접 읽어 메인 메모리 변수를 쓰지. 다른 스레드가 직접 다른 변수의 작업 메모리에 액세스 할 수 없습니다 사이 스레드간에 전달 된 변수는 메인 메모리를 완료하는 데 필요합니다.

 

 

 

 메모리 사이 셋째, 상호 작용

  메인 메모리와 상호 작용 프로토콜, 즉의 작업 메모리 사이의 콘크리트에 대해 작업 메모리에 메인 메모리 복사하는 방법 변수, 어떻게 작업 메모리에서 메인 메모리로 다시 동기화 구현 세부 사항 등, 자바 메모리 모델 무거운 우정 작업의 작은 8 종류 완료되면 가상 머신 구현 분할 될 수없고, 각 조작 원자 후술되는 것을 보장한다.

  1. 고정 (로크) : 전용 스레드 상태 변수로 식별되는 주기억 변수에 작용.

  2. 해제 (잠금 해제) 변수의 방출이 다른 스레드에 고정 될 수 후 변수가 잠금 상태에있는 메인 메모리 변수의 역할은 해제된다.

  3. 리드 (판독) : 후속 사용 부하 동작, 작업 메모리에서 스레드의 작업 메모리에 주기억으로부터의 변수 값 주기억 변수에 작용.

  4. 부하 (하중) : 작업 메모리에 변수 값을 주 메모리 카피로부터 판독 된 변수에서 얻어진 작업 메모리 변수의 역할.

  5. (사용) : 메모리 실행 엔진에 변수 값을 전달하는 일 작업 메모리 변수의 역할.

  6. 지정 (할당) 실행 엔진의 값을 수신하여 메모리 작동 변수의 역할은 작업 메모리 변수에 연결된다.

  제 저장소 (저장) 메모리 변수 변수를 메인 메모리로 전송되는 메모리의 값을 작업의 역할, 기록 동작이 후속 사용하므로.

  8. 기록 (쓰기) : 작업 메모리 변수에 주기억으로부터 얻어지는 가변 저장 연산 값 주기억 변수에 작용.

 

 

네, 휘발성 변수

  1) 스레드간에이 변수의 시인성을 확보 할

    의미 : 스레드가 휘발성 변수를 수정하면 다른 스레드가 알 수

원칙은 : 스레드가 작업 메모리에있는 휘발성 변수를 수정합니다, JVM은 브러쉬 화이트 메모리의 최신 값이됩니다 휘발성 변수의 사용 스레드는 메인 메모리의 시작 값, 작업 메모리에 브러시를 읽습니다.

  2) disable 명령 재정렬 최적화

   명령문이 실행될 때 코드의 휘발성 변수는 문 뒤에있을 수 없다는 진술하기 전에 이전 문은 구현이 때문에 효과는 "장벽을 통과 할 수없는 재배치 명령 메모리"를 형성 완료되었다는 것을 의미합니다.

 

 

다섯째, 자성, 주문 및 가시성

  자성 : 자바 메모리 모델을 읽을 다만, 부하, 사용, 지정, 저장, 쓰기 작업은 불가분의 작업 원자입니다. 원자 광범위한, JVM 사용 잠금, 이들 두 작동이 사용자에게 직접 제공되지 않고, 동작 제어를 해제 바이트 코드 명령 monitorenter 상기 monitorexit (사용될 수 키워드 동기화 ) 암시 적으로 제공한다.

  가시화 : 메인 메모리로부터 판독 모드 변수 값은 가시성을 달성 새로 전에 새로운 값의 변수 값을 수정하여 자바 모델은 메모리, 메인 메모리와 동기화된다. 휘발성, sychronized, 마지막 키워드는 가시성을 보장 할 수 있습니다. 일반적인 변수 휘발성 가변 상이은 휘발성 수정 후 해당 변수 즉시 메인 메모리와 동기화된다. 후 동기화 잠금 해제 조치는 메인 메모리에 동기 변수를 강제로. 생성자의 초기화 완료 후 최종 변수 타입, 아닌 "이"기준은 시인성을 확보 할 수 기절.

  주문 : 다른 스레드에서 관찰 된 경우이 스레드가 관찰되는 경우, 모든 작업은 정렬, 모든 작업은 순서가 있습니다. 먼저 구문 "직렬 의미론의 성능 스레드"마지막 부분 "명령 재 배열"및 "작업 메모리와 주기억 동기화 지연"현상 수단을 말한다. sychronized 키워드 보증 선 사이의 휘발성, 질서 작업. 휘발성은 하나의 스레드가 작업을 잠글 수 있도록 변수 시간을 보장 sychronized, 명령 재정렬을 금지합니다.

 

 

발생 여섯째, 제 원리

   또한 자바 메모리 자신의 휘발성뿐만 아니라 모든 질서의 모델과 동기화 완료,하지만 "첫 번째 항목"(일-전) a의 원리에 의존한다. 원리는 주 단위의 스레드 안전이 원칙에 의존하고 있는지, 패키지는 충돌의 가능성은 두 개의 동시 운영 환경 사이에 존재 가능한 모든 문제를 해결할 수, 경쟁이 있는지 여부를 결정하는 것이다.

  자바 메모리 모델에서 정의 된 두 동작 간의 제 1 부분 순서 관계가 발생 ㄴ 동작, 동작은 관찰 생성 A B의 동작에 영향을 미칠 수있는 경우, 상기 제 A가 발생하기 전에 , "효과"공유 메모리를 수정 포함 변수의 값은 상기 메시지는 호출 방법을 전송한다.

 

  1. 프로그램 순서 규칙 (프로그램 순서 규칙) : 

     스레드에서 주문 코드입니다.

   2. 튜브 잠금 규칙 (모니터 잠금 규칙) :

     제 해제 동작 후의 로크 동작 로크의 얼굴이 발생한다. 여기가 같은 잠금, 그리고 "다시는"시간 순서를 의미하는 것이 강조되어야한다.

   3. 휘발성 변수 규칙 (휘발성 변수 규칙) :

     휘발성 기록 동작 변수는이 변수의면에 제 1 판독 동작 이후에 발생한다.

   4. 스레드 시작 규칙 (스레드 시작 규칙) :

     이 글에서 모든 움직임 Thread 오브젝트 () 메소드 발생 제를 시작한다.

  5. 线程终止规则(Thread Termination Rule):

    线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。

  6. 线程中断规则(Thread Interruption Rule):

   对线程interrupt()方法的调用先行于中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。      

  7. 对象终结规则(Finalizer Rule):

   一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。

  8. 传递性(Transitivity):

   如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的操作。

 

  时间先后顺序与先行发生原则基本没什么关系,所以衡量并发安全问题时不要受时间顺序的干扰,一切必须以先行发生原则为准。

  

 

七、java线程状态转换

java语言定义了5种线程状态,在任意一个时间点,一个线程有且只有其中一种。

1)新建(New):  新建尚未启动的线程

2)运行(Runnable): 处于该状态的线程有可能正在运行,也可能正在等待CPU为它分配执行时间。

3)阻塞(Blocked): 线程竞争排他锁后并未获取到排他锁时会进入阻塞状态,处于该状态的线程在等待排他锁。

4)无限期等待(Waiting) / 有限期等待(Timed Waiting):

  处于Waiting状态的线程不会被分配CPU执行时间,它们要等待其他线程的显式唤醒。

  处于Timed Waiting状态的线程不会被分配CPU执行时间,不过无需等待被其他线程显式的唤醒,过一段时间它会自动被系统自动唤醒。

5)结束(Terminated): 已终结线程的线程状态。

     

 

学习资料:

  <深入理解java虚拟机>

 

 

추천

출처www.cnblogs.com/timfruit/p/10338954.html