>  기사  >  Java  >  Java의 동기화 키워드 사용법 소개(코드 예)

Java의 동기화 키워드 사용법 소개(코드 예)

不言
不言앞으로
2019-01-30 11:21:013707검색

이 글은 Java에서 동기화된 키워드의 사용법을 소개합니다(코드 예제). 필요한 친구들이 참고할 수 있기를 바랍니다.

동시 프로그래밍에서는 동기화 키워드가 일반적인 역할입니다. 이전에는 동기화된 키워드 가중치 잠금을 호출했지만 JDK1.6에서는 동기화가 최적화되었으며 편향된 잠금 및 경량 잠금이 도입되었습니다. 이 기사에서는 동기화된 키워드를 사용하는 방법, 바이어스 잠금, 경량 잠금 및 무거운 잠금의 차이점과 구현 원리를 소개합니다.

먼저 동기화 키워드의 4가지 용도를 살펴보겠습니다.

1. 일반 메소드 수정

private synchronized void synMethod(){
}

이 사용법에서는 동기화된 잠금의 객체 인스턴스입니다.

2. 정적 메소드 수정

private static synchronized void synMethod(){
}

synchronized 이 경우 현재 Class 객체가 잠겨 있습니다.

3. 동기화된 메서드 블록

private  void synMethod1(){
        synchronized(this){
            
        }
    }    
    private  void synMethod2(){
        synchronized(ThreadTest.class){
            
        }
    }

synMethod1은 개체 인스턴스를 잠급니다. synMethod2는 현재 클래스 개체입니다.

잠금 원리 다시 소개

잠금 원리를 소개하기 전에 먼저 Java 개체 헤더인 Mark Word에 대해 32비트를 예로 들어 알아 보겠습니다.

경량 자물쇠

잠금 상태

25비트

4bit

1bit

2bit

 

🎜 🎜 #

23비트

2비트# 🎜 🎜 #

잠금 편향 여부

잠금 플래그

# 🎜 🎜#

#🎜🎜 # # 🎜🎜#스택의 잠금 레코드에 대한 포인터

0

#🎜 🎜#

헤비웨이트 잠금장치

뮤텍스(헤비급 잠금)에 대한 포인터

10

GC 태그

비어있음

11

편향된 잠금

ThreadID

Epoch

객체 세대

1

01

无码

#🎜 🎜# # 🎜🎜#Object'shashCode

객체 생성 연령#🎜🎜 ## 🎜 🎜#

0

01#🎜🎜 ## 🎜 🎜#

위 표는 객체가 각 잠금 상태일 때 객체 헤더에 저장되는 정보를 설명합니다.

1. Biased lock

실제 환경에서 스레드가 동기화된 블록에 액세스할 때, 잠금을 위해 경쟁하는 다른 스레드가 없으며 동일한 스레드가 잠금을 여러 번 획득합니다. 즉, 단일 스레드가 동기화 코드를 실행하는 경우 스레드가 매번 차단되면 CPU 성능이 낭비됩니다. 이 경우 편향된 잠금 개념이 도입됩니다.

  • 액세스 동기화 코드 블록#🎜 🎜#

  • 개체 헤더 Mark Word에 저장된 스레드 ID가 현재 스레드를 가리키는지 확인합니다. 그렇다면 현재 잠금이 있음을 나타냅니다. 재진입 아니요 잠금을 다시 획득하고 동기화 코드를 직접 실행해야 합니다

  • 그렇지 않은 경우 CAS 알고리즘을 사용해 보세요. 스레드 ID를 개체 헤더로 업데이트합니다.

  • 성공적으로 잠금을 획득하고 동기화 코드를 실행합니다. 업데이트에 실패하면 전역 안전 지점을 기다리고 편향된 잠금을 소유한 스레드를 일시 중단한 다음 편향된 잠금을 경량 잠금으로 업그레이드하거나 잠금 플래그에 따라 잠금 없음으로 설정하도록 선택합니다. 개체 헤더.

-XX:-userBiasedLocking=false를 사용하여 JVM 편향 잠금 최적화를 끌 수 있습니다. 기본적으로 경량 자물쇠. ### ## ## ####2. 🎜#동기화된 코드 블록에 접근할 때, 먼저 현재 스레드의 스레드 스택에 잠금 기록(Lock Record) 영역을 생성합니다.

객체 헤더 Mark Word를 잠금 기록에 복사합니다.

CAS를 사용하여 개체 헤더의 스레드 포인터 업데이트 시도 Word를 현재 스레드에 대한 포인터로 표시

    #🎜🎜 #업데이트가 성공하면 경량락을 획득하게 됩니다.
  • 업데이트에 실패했습니다. Mark Word의 포인터가 현재 스레드를 가리키는지 확인하세요.
  • 그렇다면 잠금 장치가 재진입 가능하다는 의미입니다. 동기화된 코드 블록을 실행합니다
  • 그렇지 않다면 지금 경쟁이 있다는 뜻입니다. 경량 잠금장치를 중량 잠금장치로 확장해야 합니다.
  • 3. 웨이트 락
  • 웨이트 락은 물체 모니터(Monitor)를 기준으로 구현됩니다.

  • 스레드가 동기화 코드를 실행할 때 Monitor.enter 명령어를 호출해야 합니다. 실행이 종료된 후 Monitor.exit 명령어를 호출하세요. 여기서는 모니터가 배타적이라는 것을 알 수 있습니다. 특정 시점에 하나의 스레드만 성공적으로 들어갈 수 있고 다른 스레드는 대기열에서만 차단될 수 있습니다. 따라서 이 웨이트 잠금 장치는 작동 비용이 매우 비쌉니다.

위 내용은 Java의 동기화 키워드 사용법 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제