JVM 가상 머신 노트 <칠> 스레드와 메모리 모델

자바 메모리 모델

메인 메모리와 작업 메모리
자바 메모리 모델의 주요 목표 : 프로그램 액세스 규칙이 변수를 정의, 즉, 메모리에 저장된 가상 머신의 변수와 메모리에서 제거와 같은 변수의 기본 사항. 여기서, 자바의 변수 (가변)를 약간 다른 변수, 프로그램 대상 지역 변수 (스레드 비공개) 매개 변수를 포함하지 않는 방법을 구성 인스턴스 변수 / 정적 필드 및 배열 요소를 포함한다. 더 실행 성능을 얻기 위해, 자바 메모리 모델을 교체 할 프로세서와 메인 메모리를 사용하여 특정의 레지스터 또는 캐시 엔진을 수행하는 데 한정되지 않고, 또한 이러한 권한을 조정하는 시간 컴파일러 코드 실행 순서에 제한되지 않는다. 

모든 변수 (가상 시스템 메모리의 일부)에서 메인 메모리 (메인 메모리)에 저장되는 자바 메모리 모델을 지정합니다. 각 스레드는 자신의 작업 메모리 (작업 기억)가, 메인 메모리의 복사본의 복사본을 저장하는 작업 기억의 스레드가 작업 메모리에 있어야합니다 (등 읽기 / 할당) 변수에 대한 모든 작업을 스레드, 스레드 변수에 사용됩니다 수행하지만, 직접 읽고 메인 메모리 변수를 쓸 수 없습니다. 다른 스레드가 직접 다른 변수의 작업 메모리에 액세스 할 수 없습니다 사이 스레드간에 전달 된 변수의 값은 모두 메인 메모리에 의해 수행 될 필요가있다.

여기서, 주기억 / 작업 메모리 및 Java 자바 스택 / 힙 / 메소드 영역의 메모리 영역의 메모리 분할과 동일한 수준이 아니다. 연관 모두 강제되어야하는 경우, 주 메모리로부터 정의되는 변수 / / 스택의 일부 영역에서 가상 머신의 메모리 대응 가공 작업 메모리, 메인 메모리, 자바 힙 개체의 인스턴스에 대응하는 주 데이터 부, 볼 . 낮은 수준에서, 메인 메모리는 하드웨어 메모리이며, 작업 기억의 우선 순위는 레지스터와 캐시에 저장되어 있는지 확인 할 수 있습니다 더 나은 계산 속도, 가상 기계 및 하드웨어 시스템을 구하십시오.

메모리 사이의 상호 작용
변수의 구현 세부 사항을 다시 동기화 메인 메모리에서 작업 메모리로 메인 메모리에서 복사 작업 메모리와 같은 자바 메모리 모델을 정의하는 방법 메인 메모리 사이의 작업 메모리 특정 상호 작용 프로토콜, 즉 팔을 다음 : 완료하는 작업
잠금 (잠금) 메모리에서 주요 변수의 역할은 현재 스레드에 전용으로 표시된 변수의 메인 메모리, 다른 스레드는 스레드에 배타적 상태로서 식별되는 변수에 액세스 할 수있다.
잠금 해제 (언 로크) : 주기억 변수의 역할은, 변수는 잠긴 상태에서 다른 스레드에 의해 고정 할 수 있도록 해제된다.
읽기 (READ) : 메인 메모리에 변수에 영향을 미치는 변수의 값이 후속 사용 부하 운전에 대한 스레드의 작업 메모리, 메인 메모리에 전송된다.
부하 (하중) : 작업 메모리에 변수에 영향을 미치는, 메모리 변수의 작업 사본으로 메모리로부터 획득 된 변수 값의 판독 동작.
: 용도 (사용) 가상 만남 바이트 코드 명령어 변수 값을 사용하는 것이 필요할 때, 가변 엔진을 수행하는 메모리 값을 전달, 작업 메모리에서 동작하는 가변의 동작을 수행한다.
(과제) Assgin : 워크 메모리에 작용하는 변수의 값을 상기 작업 메모리로부터 수신하는 실행 엔진 변수에 할당되고,이 작업마다 가상 만남 가변 할당에 바이트 코드 명령어를 수행한다.
저장소 (저장) 작업 메모리 변수 영향은 워크 메모리에 변수 값은 후속 사용을 위해 메인 메모리에 쓰기 작업을 전송한다.
쓰기 (기록) 메인 메모리에 변수에 영향을 미치는, 작업 메모리 변수에 주기억으로부터 얻어진 변수 저장 연산의 값.

변수가 작업 메모리에 주기억으로부터 복사되는 경우, 판독 및로드 작업은 순서대로 수행되는, 가변 동기화 작업 메모리로부터 메인 메모리에 다시, 그리고 순차적으로 저장하는 기록 동작을 실행할 경우. : 자바 메모리 모델은 다음과 같은 규칙이 상술 한 8 개 가지 기본 작업을 수행 할 때 충족되어야합니다
, 어떻게 읽고로드, 저장 및 쓰기 작업이 변수는 메인 메모리에서 읽을 수 있지만 작업 메모리에 동의하지 않을 허용하지 않는, 별도로 하나의 발생을 허용하지 또는 메인 메모리를 쓰기 만 작업 메모리가 다시 시작하는 데에서 상황은 허용되지 않습니다.
스레드가 다시 메인 메모리에 변경 내용을 동기화하는 데 필요한 작업 메모리의 변수를 변경 한 후, 즉 가장 최근의 할당 작업을, 폐기하는 것을 허용하지 않습니다.
그것은 스레드가 이유 (조치가 발생 할당하지) 메인 메모리에 대한 작업 메모리 스레드 동기화 후면에서 데이터입니다 허용하지 않습니다.
메인 메모리의 새로운 변수 만 "탄생"할 수 초기화되지 않은 변수 (부하 또는 할당) 직접 메모리에 작업을 사용할 수 없습니다, 당신이 먼저 실행이 사용하고 변수를 저장하기 전에 실행 된 할당해야하고 로드 작업.
오직 하나의 스레드가 로크를 작동 가능 동시에 가변하지만 로크 조작 후 반복 해제 만 동일한 조작을 수행, 잠금, 스레드 여러 번 반복 될 수 있으며,이 변수는 해제 될 것이다.
당신이 변수에 잠금 작업을 할 경우, 좀비는이 변수의 작업 메모리 값을 지우려면,이 변수를 사용하는 실행 엔진 이전에, 우리가 필요 다시 실행하거나 할당 값로드 작업 초기화 변수.
변수가 이전에 잠금 작업을 고정되지 않은 경우, 라이브 다른 스레드에 의해 잠겨 변수의 잠금을 해제 할 수 없습니다 잠금 해제 작업을 수행 할 수 없습니다.
변수에 잠금 해제 작업을 수행하기 전에 메인 메모리 (실행 저장 및 기록 동작)에 대한 가변 반드시 제 1 동기 백.

특별한 내용은 휘발성 형태 변수 규칙

휘발성 키워드는 자바 가상 머신에 의해 제공되는 대부분의 경량 동기화 메커니즘이라고 할 수있다.
변수가 휘발성으로 정의 될 때, 두 가지 기능이있을 것이다 :
먼저 모든 스레드의 가시성을 보장하는 것입니다 , "가시성"수단이 변수의 값이 다른 스레드의 새로운 값이 스레드가 수정 될 때 그것은 바로 배울 수 있습니다.

휘발성 변수에 대한 가시성 오해 "휘발성 변수가 휘발성 쓰기 작업에 모든 변수 즉시 즉, 다른 스레드에 반영 할 수있다, 모든 스레드를 즉시 볼 수는 각 스레드에서 휘발성 변수 때문에, 동일 휘발성 변수의 계산에 따라 동시성에서 "안전합니다. 그 문장의 인수가 잘못 아니지만, 그 인수는이 결론 "운영 휘발성 변수가 동시성에서 안전을 기반으로"따라하지 않습니다.
휘발성 변수 휘발성 변수는 각 스레드의 작업 메모리 불일치 할 수있다 (일관성의 각 스레드의 작업 메모리에 존재하지만, 사용할 때마다 새로 고침을하기 전에, 일관성이 실행 엔진이 표시되지 않습니다 상황이이를)에는 불일치가없는 것으로 생각되지만, 자바 조작 내부 안전 등의 동시 작동 휘발성 가변 선도 원자 조작 아니다.

 

은 javap이 증가 () 클래스 파일 바이트 코드에서 단 한 줄의 코드 만의 방법 (복귀 명령은 인종에 의해 생성되지 않습니다 네 개의 명령어로 구성되어 발견과 문제는 디 컴파일 된 코드들 사이에서 증가 작업 "인종 ++"에서 발생 ++ 값이이 시점에서 키 휘발성 레이스의 값이 올바른지, 스택 동작하기위한 경쟁을 얻어 때 getstatic 명령이 명령은 즉시의 바이트 레벨 동시 고장 원인에서) 계산 될 수있다 이 지침을 IADD 때 실행 iconst_1에, 다른 스레드 스택의 동작의 값이 오래된 데이터를하게하면서, 그래서 putstatic 명령은 인종의 실행 후 작은 값을 넣어 수도, 경주의 가치를 증가 할 수있다 메인 메모리에 동기화 다시.

객관적으로도 하나 개의 명령을 컴파일하기 때문에 여전히 엄격한 아니라, 동시성 문제를 분석하는 바이트 코드를 사용하여,이 시간을 말하고,이 지침의 구현은 원자 연산이다 것을 의미하지 않는다. 여기에 -XX를 사용 실행 설명은, 설명이 의미를 구현하기 위해 많은 코드를 실행하는 바이트 코드 지침은, 컴파일러 구현 경우, 바이트 코드 명령은, 네이티브 머신 코드 명령어의 여러 조각으로 변환 할 수 있습니다 : + PrintAssembly 출력 파라미터 컴파일 중 일부는보다 엄격한 분석하는 것이다.

때문에 휘발성 변수의 가시성 만 보장하려면 다음 두 가지 규칙을 준수하지 않는 장면을 계산에, 우리는 여전히 자성을 보장하기 위해 (java.util.concurrent의 동기화 원자 클래스를 사용하거나) 잠금을 통과해야합니다 :

1)의 연산 결과는 변수의 현재 값에 의존하지 않는 또는 값을 하나의 스레드 만이 변수를 수정하는 것이 보장 될 수있다.

2) 변수는 일정한 제약 다른 상태 변수에 참여할 필요가 없습니다.

제 재주문 명령의 의미를 사용하여 휘발성 변수 최적화 금지 일반 변수 모두에 대한이 방법을 실행하는 동안 얻어진 결과를 보정 할 수 있도록한다 할당 결과에만 의존하지만, 순서 보장 할 수없는 가변 할당 프로그램 코드의 실행의 일관성을 위해. 방법 스레드의 실행 중 (WithinThread AS-IF-직렬 의미에서 설명 자바 메모리 모델 소위 "직렬 의미론 암나사 실적 '인 시점을 인식 할 수 없기 때문에 ).

동시 보호 안전 도구에서 휘발성 선택의 중요성 : 경우에 따라 (또는 잠금 장치 내부의 동기화 키워드 java.util.concurrent의 패키지를 사용) 잠금에 우선 순위를 부여하는 것이 참으로 휘발성 동기화 메커니즘의 성능,하지만 인해 가상 머신 많은 사람을 제거하고 잠금 장치의 최적화 된 구현을 위해 어려운 빠른 동기화보다 것으로 판단 얼마나 휘발성 정량화합니다. 소비 일반적인 성능 변수 조작 휘발성 변수가 거의 차이 판독하지만 발생하지 주문 이행 프로세서를 위해 지역 코드에 삽입 된 메모리 배리어 명령을 많이 필요로하기 때문에 기입 동작을 느리게 할 수있다. 그럼에도 불구하고, 총 비용은 여전히 잠금보다 낮은 가장 휘발성 시나리오, 우리는 휘발성 및 휘발성 잠금 중에서 선택할 수있는 유일한 근거는 현장의 요구를 충족 할 수 있습니다 단지 의미입니다.

휘발성 변수에 대한 특별 규칙 자바 메모리 모델 정의 . 로드, 사용, 할당 저장 및 기록 동작은 다음의 규칙을 충족 할 때 T 스레드를 나타내는 것으로, V 및 W는 휘발성 가변하고 판독 된 수행을 대표한다고 가정

1) 하중, T V는 사용을 실행하기 위하여 때 변수 V의 이전 작업 스레드 T가 수행되는 경우에만, 위하여 사용 T V 부하를 수행 할 때에 만 T V 동작 후에 실행된다. 은 V의 T 사용, T 부하는 V. 고려 될 수있다 (각 사용이 다른 스레드 V 수정의 값을 볼 수 있도록, 메인 메모리 V의 시작하기 전에 최신 값을 새로 고쳐야합니다,이 규칙은 작업 메모리를 필요로) 행에 함께 표시해야하며, 관련 조치를 읽어 보시기 바랍니다.

2) T의 이전 동작은 ASSIGN V 수행하는 매장의 V T는 때만 그리고하는 T 동작 저장소 V에서 수행 된 후에 만, V T에 할당 수행. V T 및 T 스토어 V로 생각할 수 지정하려면, 쓰기 동료가이 규칙은 작업 메모리를 필요로 (행에 함께 표시해야하며, 수정 된 각 V는 즉시 다른 보증을위한 메인 메모리로 다시 동기화해야합니다 스레드)는 V 년대에 자신의 수정을 본다.

3) 가정하면, 동작 A가 사용 또는 할당 동작 V 실시 예로 T 인 것으로 가정 동작 F이고 작업 관계되는로드 또는 저장 동작을 가정하여 동작 P이고, F는 판독 또는 V의 기록 동작에 대응하는 역할;처럼 및 , B는 T 또는 동작 W 사용 할당 형태, 및 G의 동작 추정되는 것으로 가정된다 동작 B와 연관 Q 액션 조작 판독 또는 기록 동작의 G W에 대응하는 것으로 가정 조작로드 또는 저장 동작. 경우 B 전에, 다음 P Q는 전 (이 규칙은 프로그램 코드 것을 보장하지 재정렬 될 명령어는 순서대로 실행하는 휘발성 변수 최적화를 요구)한다.

긴 더블 형 변수에 대한 특별 규정

64 비트 데이터 형식 (길이 배) 가상 머신을 허용하는 변형되지 않은 휘발성 판독 동작은 두 개의 32 비트 동작으로 분할하여 64 비트 데이터로드의 종류를 선택하도록 보장되지 않을 가상 머신의 구현을 허용하는 실행되고, 상점 그것은 비 계약 원자 길고 두 (더블 길이 변수의 세분화 처리) 시점에, 판독, 4 개의 원자 쓰기 작업.

다중 스레드는 긴 또는 double 형 변수로 휘발성 선언, 읽기 및 수정 작업에 대해 동일한 시간에, 다음 몇 가지가 아닌 원래의 값이 스레드를 읽을 수 없으며 가치를 수정하는 다른 스레드의 대표 공유하는 경우 값 "반 태그".

그러나, "반 변수"와 같은 독자는 자바 메모리 모델은 가상 머신을 허용하는 긴 읽기 및 원자 작업으로 구현 더블 변수하지 않는 동안 때문에, (현재 상업 VM에 표시되지 않음) 매우 드물지만 경우 이러한 작업은 원자 작업입니다 선택 구현 된 가상 머신을 수 있지만이를 달성하기 위해 가상 머신을 "추천".

아톰, 가시성과 질서

원 자성 (자성) : 직접 자성 변수의 작동을 보장 할 수있는 자바 메모리 모델로는 상기 읽기, 부하, 할당, 사용, 저장 , 및 쓰기 , 우리는 일반적으로 액세스의 기본 데이터 타입 (긴 더블 예외)의 원자를 포함하는 것으로 간주 될 수있다.

응용 프로그램 시나리오는 더 큰 범위를 자성의 보증을 요구하는 경우, 자바 메모리 모델은 가상 컴퓨터가 사용자에게 직접 공개 잠금 및 잠금 해제 작업에없는에도 불구하고, 충족 수요에 잠금 및 잠금 해제 작업을 제공하지만, 단어의 높은 수준을 제공합니다 바이트 코드 monitorenter 암시 두 연산을 이용 monitorexit 설명서, 자바 바이트 코드 명령 코드 모두 너무 반응 싱크 블록, 키워드 --synchronized 인 동작도 동기 블록 자성 사이에 제공된다 .

가시성 (가시성) : 스레드가 공유 변수의 값이 변경 될 때, 다른 스레드는 즉시 이러한 변화를 인식 할 수 지칭한다.

뿐만 아니라 휘발성 , 자바는 가시성을 달성하기 위해 두 개의 키가, 동기화 및 최종 . 가시성 싱크 블록 "변수에 잠금 해제 동작을 수행하기 전에 변수는 메인 메모리 (저장 및 쓰기 작업이 수행)로 다시 동기화해야 의해 결정 이 규칙 최종 키워드 수단의 가시성에 의해 얻어지는" 으로 최종 수정 필드가 생성자에서 초기화, 생성자가 "이"참조가 밖으로 통과하지 못한되면 (이 참조 탈출, 매우 위험한 일이다 "초기화 절반이 참조를 통해 액세스 할 수있는 다른 스레드가있다 "개체), 그 다음 다른 스레드는 필드의 최종 값을 볼 수 있습니다.

질서 (주문) : 같은 단어의 자연 순서에서 자바 프로그램이 요약 될 수있다 : 만약이 스레드에서 볼, 모든 작업은 정렬, 관찰 스레드에서 다른 스레드, 모든 작업의 경우 그들은 무질서하고 있습니다. 제 어구 "직렬 의미론 발현 스레드"로 지칭한다 (내 스레드로서의 경우 - 시리얼 의미), 워드 수단 "명령 재정렬"현상 "작업 메모리와 주기억 동기화 지연"현상 후.

자바 언어는 스레드 간의 질서있는 운영, 휘발성 키워드 자체가 의미를 재정렬 금지 명령을 포함을 보장하기 위해 두 개의 키워드 휘발성 및 동기화 제공하지만이 변수가 동시에에만 허용 "에서 동기화 동작 "규칙 수득 잠금 스레드 규칙 결정 만 직렬 입력 할 수있는 두 개의 동기 블록 로크를 보유하고있다.

첫 번째 항목의 원리

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

여기에 어떤 지원 동기가 이미 존재하지 않고, 코드에서 직접 사용할 수있는, 먼저 자바 메모리 모델에서 발생 일부 "자연"의 관계이다. 두 작업 사이의 관계가 나열되어 있지 않으면 다음과 같은 규칙으로 밀어 할 수없는 경우, 그들은 순서의 보장이 없다, 가상 머신들을 자유롭게 순서를 변경할 수 있습니다.

1) 프로그램 순서 규칙 (프로그램 순서 규칙) : 스레드에서 코드 책 사설 쓰기 작업의 프로그램 순서에 따라하면 첫 번째 작업 후 발생합니다. 정확하게 프로그램 코드의 순차적 흐름을보다 제어되어야 분기 / 루프 구조로 간주된다.

2) 튜브 잠금 규칙 (모니터 잠금 규칙) : 첫 번째 잠금 해제 작업이 발생 잠금 운영에 나중에 같은 잠금에 직면 해있다. 여기가 같은 잠금, 그리고 "다시는"시간 순서를 의미하는 것이 강조되어야한다.

3) 휘발성 가변 규칙 (휘발성 가변 규칙) 휘발성 가변 쓰기 먼저 "뒤로"가 시간 순서를 의미 판독 동작 이후에,이 변수의 얼굴에서 발생.

4) 쓰레드 개시 규칙 (스레드 시작) 규칙 시작이 글의 Thread 오브젝트 () 메소드 처음 나타나는 모든 운동.

5) 스레드 규칙 (스레드 종료 규칙)를 종료한다 : 모든 작업이 스레드의 검출에서, 우리는를 Thread.join으로 끝낼 수 발생 앞서 스레드 종료되어 () 메소드 /Thread.isAlive () 반환 값은 다른 수단에 의해 검출 군은 종료되었습니다.

6) 일반 스레드 인터럽트 (중단 규칙 스레드) 인터럽트가 발생하는 경우 호출 스레드 인터럽트 () 메소드는 우선 인터럽트 이벤트 인터럽트 스레드 코드 검출의 발생은 () 메소드 Thread.interrupted 의해 검출 될 수 일어난다.

룰 객체 (파이널 규칙) 7) 끝 : 오브젝트의 초기화는 최초 시작의 마무리 () 메소드에서 발생 (생성자 실행하는 단부)가 완성된다.

8) 이행 성 (이행 성) 의 동작은 앞서 절차 B를 발생하는 경우, B의 전방 동작 동작 C에서 발생하는 동작은 제 1 동작에서 발생 A 내지

 우리가 간섭 연대기 동시 보안 문제를 측정하지 않아도 발생 순서에 처음으로, 기본 원칙 사이에 많은 관계없는, 모든 것이 처음 발견의 원칙이 적용되어야합니다.

자바 스레드

동시 멀티 스레딩에 반드시 의존하지 않는,하지만 자바 동시성, 스레드의 가장 피할 수없는 관계에 대해이 이야기.

스레드를 구현

주류 Caozuojitong 자바 언어는 동일한 프로세스 및 Caozuojitong 다른 하드웨어 플랫폼에서 스레드를 제공, 스레드 구현을 제공, java.lang.Thread의 클래스의 각 인스턴스는 스레드를 나타냅니다. 자바 API의 대부분의 스레드 클래스와 키 모든 방법은 기본으로 선언, 유의 한 차이가있다. 네이티브 방법은 사용할 수 없습니다 또는 자바 API에서이 방법을 의미 달성하기 위해 플랫폼 독립적 인 수단을 사용할 수 없습니다. 이러한 이유로, 우리는 여기에 대신 "스레드를 달성하기 위해"있다 "달성하기 위해 자바 스레드."

구현 스레드는 세 가지 주요 방법입니다 :

1. 커널 스레드 구현

커널 스레드 (커널 스레드, KLT)이 이 스레드는 커널 스레드 스위치에 의해 완료되면, (이하 핵심이라 커널) 운영 체제 커널 지원 스레드에 의해 바로, 스케줄러 (스케줄러)를 조작하여 커널 스레드 스케줄링, 그리고 책임이있다 스레드의 작업은 각 프로세서에 매핑. 운영 체제가 동시에 여러 작업, 멀티 스레드 멀티 스레딩 커널라는 커널 (멀티 스레드 커널)에 대한 지원을 처리 할 수있는 능력을 가지고 각각의 커널 스레드는, 여분의 핵심으로 볼 수있다.

프로그램은 일반적으로 커널 스레드로 직접 이동하지 않지만, 커널 스레드에 고급 인터페이스를 사용하는 - LWP (경량 프로세스, LWP), 우리가 인해로, 스레드의 일반적인 의미에 대해 이야기하는 것이 경량 프로세스를 각 코스는 가벼운 커널 스레드 지원으로 구성되어 경량 프로세스를하기 위해, 그래서 첫 번째 지원 커널 스레드. 이 경량 프로세스와 커널 스레드 간의 1 : 1 관계는 하나의 스레딩 모델을했다.

경량 프로세스 제한 :이 달성하기 위해 커널 스레드 기반으로하기 때문에, 같은 생성 / 파괴와 동기화 등의 과정을 운영, 다양한, 그래서 우리는 시스템 호출이 필요합니다. 시스템 호출의 상대적으로 높은 비용, 사용자 모드 (사용자 모드) 및 커널 모드 (커널 모드)에서 앞뒤로 전환 할 필요가 각 경량 프로세스의 요구가 지원 커널 스레드를 가지고, 경량 프로세스 그러므로 소비 할 필요가 (예 : 커널 스레드의 스택 공간 등) 일부 커널 리소스, 따라서 시스템 지원은 경량 프로세스가 제한된다.

2. 사용자 스레드 구현

사용자는 커널 스레드가 존재 구현하는 인식 할 수없는, 좁은 의미는 전적으로 사용자 공간 쓰레드 라이브러리에 의미 스레드. 사용자 스레드 / 동기화 / 파괴를 만들려면 사용자 모드에서 완전히 수행 일정, 커널은 도움을 필요로하지 않습니다. 프로그램이 제대로 구현되면,이 스레드는 커널 모드로 전환 할 필요가 없습니다, 따라서 빠른 작동과 낮은 소비는 사용자 스레드에 의해 구현되는 고성능 데이터베이스 멀티 스레딩의 일부에, 스레드의 많은 수를 지원할 수 있습니다. 이 과정은 사용자 스레드 1 사이 : N 관계는 스레딩 모델 일대라고합니다.

3. 경량 사용자 스레드, 플러스 하이브리드 구현 과정

모두 사용자 스레드가, 또한 경량 프로세스가 있습니다.

 

자바 쓰레드 스케줄링

스레드 스케줄링 할당 프로세스 스레드 프로세서 사용 권한에 대한 시스템이다. 주요 방법 예약 :

멀티 스레드 시스템을 사용하여 공동 스케줄링, 실행 시간의 스레드는 스레드 자신에 의해 제어되는 시스템을 실제로 통지 작업을 수행 한 후에 스레드가 다른 스레드까지 스위치. 장점 : 간단합니다. 단점 : 실행 시간을 제어 할 수 없습니다.

선제 멀티 스레딩 시스템 호출을 사용하여 시스템에 의해 각 스레드 실행 시간, 스레드 스위칭 스레드 자체가 도움이되지 결정합니다. 자바는이 쓰레드 스케줄링을 사용합니다.

쓰레드 스케줄링은 궁극적으로 운영 체제에 의해 결정되도록 Java 스레드를 구현 원시 스레드 시스템에 매핑되기 때문에 자바 쓰레드 우선 순위의 10 개 수준을 제공하지만, 스레드의 우선 순위는 비행하지 않습니다.

상태 전이

자바 언어가 정의 의 오가지 시간에 어느 한 지점에서 프로세스 상태를, 스레드는 오직 하나 개의 상태를 가질 수 있습니다 :

새로운 (뉴) :이 상태에서 시작되지 않은 스레드를 생성합니다.

실행 (Runable) : 스레드의 상태에서 운영 체제 스레드 상태 실행과 준비를 포함하여 실행 할 수있다, 또는 그것을 위해 할당 된 CPU 실행 시간을 기다릴 수 있습니다.

무기한 (대기) 대기 : 스레드가이 상태는 CPU의 실행 시간을 할당 할 수 없습니다 것입니다, 그들은 디스플레이를 깨워 다른 스레드를 위해 대기 할 것입니다. 다음 방법은 무기한 대기 상태에 스레드합니다 :

Timeout 매개 변수는 지정된 Object.wait () 메소드에 설정되지 않는다.

Timeout 매개 변수는를 Thread.join () 메소드를 설정하지 않는다.

LockSupport.park () 메소드.

대기 기간 (시간 초과 대기) : 스레드가 있지만, 다른 스레드가 일어나 일정 시간 후 시스템에 의해 자동으로 깨어 표시 될 때까지 기다리지 않고 CPU 실행 시간을 할당 할 수없는 상태입니다. 다음 방법은 대기 상태 마감일에 스레드합니다 :

Thread.sleep를하려면 ().

되는 Object.wait () 메소드 Timeout 매개 변수를 제공한다.

를 Thread.join ()에있어서의 제한 파라미터 세트.

LockSupport.parkNanos () 메소드.

LockSupport.parkUntil () 메소드.

차단 (차단) : 스레드가 차단 "차단"과 "대기 상태"의 차이는 다음과 같습니다 "차단",이 이벤트가 잠금 시간을주는 또 다른 스레드가 될 것 배타적 락의 취득을 대기에서 일어났다; " 대기 상태는 "약간의 시간을 기다리고, 또는 웨이크 조치가 이루어집니다. 프로그램이 입력 영역 동기화 블록을 기다리는으로 진행되면, 스레드는이 상태가됩니다.

종료 (종료) : 종료 스레드 스레드 상태는 스레드가 실행을 완료했습니다.

추천

출처www.cnblogs.com/lvoooop/p/12132984.html