Java 메모리 모델
메인 메모리와 작업 메모리:
Java 메모리 모델은 모든 변수가 메인 메모리에 있고 각 스레드에는 자체 작업 메모리가 있다고 규정합니다.
작업 메모리는 스레드가 사용하는 기본 메모리의 복사본을 저장합니다. 스레드의 변수에 대한 모든 작업은 작업 메모리에서 수행되어야 합니다.
메모리 간 상호 작용:
1 잠금은 주 메모리의 변수에 작용하여 변수를 스레드 독점 상태로 식별합니다.
2 Unlock 메인 메모리에 있는 변수에 작용하고, 잠긴 변수를 해제합니다.
3 read 작업 메모리에 있는 변수에 작용하고, 변수의 값을 메인 메모리에서 스레드의 작업 메모리 중간으로 전송합니다.
4 로드는 작업 메모리의 변수에 작용합니다. 읽기 작업으로 주 메모리에서 얻은 변수 값을 작업 메모리에 있는 변수의 복사본에 넣습니다.
5 동작을 사용합니다. 작업 메모리 변수에 작업 메모리 변수의 값을 실행 엔진에 전달
6 작업 메모리 변수에 작용을 할당, 실행 엔진에서 받은 값을 실행 엔진에 할당 작업 메모리
7 함수 변수를 작업 메모리에 저장하고, 작업 메모리에 있는 변수의 값을 메인 메모리로 전송합니다.
8 write는 메인 메모리에 있는 변수에 작용하며, store 연산으로 작업 메모리에서 얻은 변수의 값을 메인 메모리에 넣는다.
변수를 휘발성으로 정의하면 두 가지 기능이 있습니다
1. 이 변수는 모든 스레드에 표시되도록 보장됩니다. 비원자적 작업의 경우 여전히 스레드로부터 안전하지 않습니다.
2 명령어 재정렬 최적화를 비활성화합니다.
원자성, 가시성 및 순서
선착순 원칙
Java 스레드의 상태 전이
New New Creation trailing edge가 변경되지 않았습니다. 시작됨 Purebred가 이 상태입니다
Running Runnable에는 운영 체제 스레드 상태의 Running 및 Ready가 포함됩니다. 이 상태의 스레드는 실행 중이거나 CPU가 실행 시간을 할당하기를 기다리고 있을 수 있습니다.
무기한 대기 이 상태의 대기 스레드에는 CPU 실행 시간이 할당되지 않으며 다른 스레드에 의해 명시적으로 깨어날 때까지 기다려야 합니다. Timeout 매개 변수를 설정하지 않고 Object.wait() 메서드 Thread.join( ) 메서드; LockSupport.park() 메서드
시간 초과 이 상태의 스레드에는 CPU 실행 시간이 할당되지 않지만 다른 스레드가 명시적으로 깨어날 때까지 기다릴 필요는 없습니다. 일정 시간이 지나면 시스템에 의해: Thread.sleep() 메소드, Timeout 매개변수가 설정된 Thread.join() 메소드, LockSupport.parkNanos() 메소드; ) 메소드
Blocked Blocked 단독 잠금 획득 대기
End Terminating 종료된 스레드의 스레드 상태