Java 프로그램에서는 때때로 높은 헤드 객체 초기화 작업을 연기해야 할 수도 있으며 이러한 객체를 사용할 때만 초기화됩니다. 이를 지연 초기화 또는 게으른 하중이라고합니다
안전하지 않은 지연 초기화를보십시오.
스레드 A가 1을 실행 한 후 객체 인스턴스가 NULL이고 새로운 IT에 대한 준비가되어 있음을 발견하고 스레드 B는 새롭고 오류가 발생합니다.
동기화 잠금 장치를 사용하여 정확성을 보장 할 수 있습니다.
그러나 전체 방법을 동기화하는 것은 너무 비싸고 사람들은 이중 점검 잠금을 일으켰습니다.
최소 범위에서 사용되는 동기화 잠금은 이중 점검을 사용하여 목적을 달성하는 것으로 보이지만 문제가 있습니다. 스레드 4를 실행하면 스레드 B의 7이 아직 실행되지 않았으며 스레드 A가 인스턴스를 결정합니다! = null. 스레드 B의 7이 아직 실행되지 않았으므로 왜 이런 일이 발생합니까?
새 인스턴스 ()의 기본 주요 구현을 살펴보십시오 () :
실제로 먼저 메모리 할당 1을 수행 한 다음 객체를 초기화하고 인스턴스를 설정하는 것입니다. 그런 다음 여기에 재주문이 있으며 2와 3의 순서가 대체 될 수 있습니다.
따라서 B가 여전히 7을 실행할 때 A는 인스턴스 객체가 초기화되었다고 결정합니다. CTORINSTANCE (메모리) 전에 인스턴스가 호출되면 오류가 발생합니다.
두 가지 해결책이 있습니다.
1. 인스턴스 객체를 휘발성으로 선언하면 2 및 3의 재정렬을 금지합니다.
2. 클래스 초기화를 기반으로 한 솔루션 사용 : JVM은 클래스의 초기화 단계에서 클래스 초기화를 수행합니다 (즉, 클래스가로드 된 후 및 스레드에서 사용하기 전에). 존재하다
실행 클래스의 초기화 중에 JVM은 잠금을 취득합니다. 이 잠금은 여러 스레드로 동일한 클래스의 초기화를 동기화 할 수 있습니다.
클래스 초기화를 기반으로 체계의 구현 코드가 더 간단하다는 것을 알 수 있습니다. 그러나 휘발성을 기반으로 한 듀얼 점검 잠금 방식은 추가 이점이 있습니다. 정적 필드의 초기화를 지연시키는 것 외에도 인스턴스 필드의 초기화가 지연 될 수도 있습니다. 필드 지연 초기화는 클래스 초기화 또는 인스턴스 생성의 오버 헤드를 줄이지 만 초기화 지연된 필드에 액세스하는 오버 헤드가 증가합니다. 대부분의 경우, 정상 초기화는 초기화 지연보다 낫습니다. 예를 들어 스레드 안전 후기 초기화를 사용해야하는 경우 필드는 위에서 설명한 휘발성 기반 지연 초기화 체계를 사용하십시오. 정적 필드에 스레드 안전 후기 초기화를 실제로 사용해야하는 경우 위에서 설명한 클래스 기반 초기화 체계를 사용하십시오.
요약
위는 편집기가 소개 한 Java Double Check Lock의 구현 코드입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!