원칙의 실현의 바닥 동기화 "자바 병행 프로그래밍의 예술"

잠금 학습 최적화, 때 개체 헤더 (마크 워드)이 필수적인 부분이며, 때문에 동기화 잠금으로 존재하는 객체 헤더 내부. 32 비트 가상 머신 객체 헤더는 64 비트 (8 바이트)를 차지하고, 64 비트 가상 머신 계정 오브젝트 헤더를 128 비트 (16 바이트) ^ objectHead] 레이아웃 객체 헤더의 종류가 동일하지 :

  • 배열 유형 : 마크 워드, 클래스 메타 데이터 주소, 배열의 길이
  • 일반적인 유형 : 마크 워드, 클래스 메타 데이터 주소

마크 단어 객체 나타내는 해시 또는 잠금 정보
클래스 메타 주소 프로세스의 주소 공간에 대응하는 오브젝트의 종류를 나타내는 데이터
배열의 길이가 (오직 객체 배열 인 경우만의 존재) 배열의 길이를 나타낸다

다음과 같이 기본 객체 헤더는 표현되어야

잠금 상태 25bit 4 비트 이 바이어스 잠금인지 1 비트 2 비트 잠금 플래그
상태 비 잠금 해시 객체 세대 시대 객체 0 01

특정 개체 메모리 레이아웃은 볼 이 기사를

JVM 설정에 따라 1 아래와 같이 특정 시간을 할당하고, 다른 것

프로세스 중량 자물쇠를 잠글 바이어스

당신은 바이어스 잠금 설정을 닫을 때, 프로세스는 왼쪽으로 갈 것이다, 그렇지 않으면 프로세스를 마우스 오른쪽 걸릴.

바이어스 잠금

때문에 대부분의 경우, 대부분의 다중 스레드 경쟁 조건에 고정되지 않고, 항상 같은 스레드를 얻을 1.6 JVM 추가 한 후 바이어스 잠금경량 잠금 , 현재 잠금 상태 네 가지 종류의 총 : 비 상태 잠금 , 바이어스 잠금 , 경량 잠금 , 잠금 중량 . 스레드에서 경쟁의 향상된 기능을 통해 잠금이 점진적으로 업그레이드합니다 (다운 그레이드).
CAS 및 경량 잠금이 두 가지를 요구 한 번만이 분야에서 바이어스 경쟁없이 잠그는 향상시킬 수 있습니다 동기화 성능은 주로 바이어스 잠금에 반영됩니다. 어떤 경우에는 프로그램의 도움이 아니라, 옵션의 무게를 할 필요합니다. 많은 경쟁 후 취소 바이어스 잠금 프로세스는 성능 병목 현상이됩니다.

바이어스 잠금을 사용할 수있는 경우, 객체의 초기화 머리를 분배 같이

잠금 상태 23bit 2 비트 4 비트 이 바이어스 잠금인지 1 비트 2 비트 잠금 플래그
바이어스 잠금 스레드 ID 시대 세대 시대 객체 1 01

잠금 절차

  1. 오브젝트 헤더 때 isBiased은 1이고, 잠금 상태가 01 , 바이어스 잠금 흐름은 다시 계속 사용할
  2. 대상체 헤더는 스레드 ID를 포함하고 있지 않은 경우, 패스 객체 CAS 직접 스레드 ID가 기록되는지를 결정. 이 시점에서 잠금은 끝났어

잠금 취소

때문에 편견 잠금의 사용 장소를 릴리스 걸립니다 경쟁까지 메커니즘을, 그래서 때 다른 바이어스 잠금 스레드를 경쟁 스레드가 잠금을 해제하는 바이어스 잠금을 개최한다.

  1. 대기 잠금 바이어스를 잡고 원래 스레드 (이하, 원래의 스레드라고도 함) 에 실행되는 글로벌 보안 점 (안전 점)
  2. 일시 정지 원래 스레드
  3. 체크 원래 스레드 , 스레드 상태를 동기 블록의 중량 바이어스에서 만약, 반대로 경량 잠금 업그레이드
  4. 복원 원래의 스레드

경량 잠금

잠금 절차

참고 : 경량 잠금 웨이크 경량 잠금을 해제 할 때 일이 남아 있기 때문에 작업이 성공적으로 CAS왔다 잠금, 웨이크 대기 CAS 오류 및 스레드 바로 인플레이션을 고정하고 블록.
예술의 자바 병행 프로그래밍 참조 사진

  1. 동기화 블록을 입력 할 첫 번째라는 연 잠금 레코드 잠금 기록을 저장하기위한 공간
  2. 마크 말씀의 제목 헤더는 현재 스레드 스택에 복사
  3. CAS 사용해보십시오 마크 워드 교체 되는 잠금 기록 포인터를 가리키는
  4. 세 번째 단계는 성공적으로 작업을하고있다 마크 말씀이 설정되어 00 상태, 정체성 경량 잠금
  5. 그리고 몸을 동기화
  6. 작업의 세 번째 부분은, 스핀 락에 들어갈 실패
  7. 로크 획득 실패하면 헤비급 스핀 로크를 수정 임계치 로크의 팽창에 도달 (판독 상태 10 )
  8. 스레드 블록

잠금 해제 과정

  1. CAS는 시도를 소유자의 잠금 기록이 다시 복사 마크 말씀을
  2. CAS에 작업이 성공하면 발생에는 경쟁이 없다는 것을 의미하고, 그렇지 않으면 3 단계 참조
  3. 잠금을 해제하고 대기중인 스레드를 깨워

개요

이 장에서는되어 동기화 프로세스에게 다양한 등급과 JVM에서 업그레이드하는 것은 주로에 의해 제어되는, 설명했다 객체 헤드 잠금 상태 일부의 수준을 제어 할 수 있습니다. 표시하여 바이어스 잠금 스레드 ID를 현재 개체가 해당 스레드에 의해 점령 된 것을 나타 내기 위해서 (때문에), 경량 잠금 교체 마크 말씀 으로 잠금 기록 주소 , 현재의 thread를 나타 내기 위해 해당 개체를 보유하고 있습니다. 아무리 다른 시나리오에서 다양한 요구가 잠금 어떤 종류의, 당신은 선택을해야 다음 표를 참조 할 수 없다

바이어스 잠금 :

  • 장점 : 추가 잠금 및 잠금 해제 소비, 단지 나노초가 격차에 비해 비동기 방법을 수행하지
  • 단점 : 스레드 간의 경쟁이있는 경우, 추가 비용을 가져올 것이다 (바이어스 잠금 해지)
  • 해당 장면 : 장면에 단 하나 개의 스레드 동기화 블록 액세스에 적합

경량 잠금 :

  • 장점 : 경쟁 스레드 혼잡을 야기하고, 절차의 응답 속도를 향상되지 않습니다
  • 단점 : 잠금을 가져올 수 없습니다 아직도 경우, 스핀을 사용하여 CPU를 소모합니다
  • 해당 장면 : 적절한 실천의 추구, 매우 빠른 동기화 블록 실행

무게 잠금 :

  • 장점 : 관리 경쟁 스레드를 사용하여 CPU를 소비하지 않는다
  • 단점 : 스레드가 차단되고, 느린 응답 시간
  • 응용 프로그램 시나리오 : 느린 특정 동기 블록 실행의 추구

이 해지 과정에서 전체 고정 장치이며, 인터넷의 확장은 다른 작업을 찾을 수


  1. 관련 JVM 설정의 바이어스 잠금 소개 : -XXBiasedLockingStartupDelay = 0이 (가) 바이어스 잠금 -XXUseBiasedLocking = 거짓 수단 바이어스 잠금을 폐쇄 활성화 몇 초 후 프로그램을 시작 나타낸다 (경쟁이 발생할 수있는시기를 결정하도록 설정할 수 있습니다) ↩를

추천

출처www.cnblogs.com/codeleven/p/10963092.html