게 으 른 초기 화 홀더 클래스(전재)
[size=large]1.먼저 해당 하 는 기초 지식[/size]을 살 펴 보 자.
우선 클래스 내부 클래스 에 관 한 지식 을 간단하게 살 펴 보 자.
[list]
[*]1.클래스 내부 클래스 는 무엇 입 니까?
쉽게 말 하면 클래스 내부 류 는 static 수식 이 있 는 구성원 식 내부 류 를 말한다.static 수식 이 없 는 구성원 식 내부 류 를 대상 급 내부 류 라 고 합 니 다.
[*]2.클래스 내부 류 는 외부 클래스 의 static 성분 에 해당 하 며 대상 과 외부 클래스 대상 간 에 의존 관계 가 없 기 때문에 직접 만 들 수 있 습 니 다.대상 급 내부 클래스 의 인 스 턴 스 는 외부 대상 인 스 턴 스 에 연결 되 어 있 습 니 다.
[*]3.클래스 내부 클래스 에서 정적 방법 을 정의 할 수 있 고 정적 방법 에서 외부 클래스 의 정적 구성원 방법 이나 구성원 변 수 를 참조 할 수 있 습 니 다.
[*]4.클래스 내부 클래스 는 외부 클래스 에 해당 하 는 구성원 으로 처음 사 용 될 때 만 불 러 옵 니 다.
[/list]
다 중 스 레 드 부족 동기 잠 금 지식 을 살 펴 보 자.
다 중 스 레 드 개발 에서 병발 문 제 를 해결 하기 위해 주로 synchronized 를 사용 하여 상호 배척 자 물 쇠 를 추가 하여 동기 화 통 제 를 하 는 것 을 잘 알 고 있 습 니 다.그러나 어떤 경우 에는 JVM 이 은근히 동기 화 를 실 행 했 기 때문에 동기 화 제 어 를 하지 않 아 도 됩 니 다.이러한 상황 은 다음 과 같다.
[list]
[*]1.정적 초기 화 기(정적 필드 나 static{}블록 에 있 는 초기 화 기)에서 데 이 터 를 초기 화 할 때
[*]2、final 필드 방문 시
[*]3、스 레 드 를 만 들 기 전에 대상 을 만 들 때
[*]4.스 레 드 가 처리 할 대상 을 볼 수 있 을 때
[/list]
[size=large]2.다음 에 이런 해결 방안 의 사고방식 을 살 펴 보 자[/size]
스 레 드 안전 을 간단하게 실현 하려 면 정적 초기 화 기 를 사용 할 수 있 습 니 다.JVM 으로 스 레 드 안전성 을 확보 할 수 있 습 니 다.예 를 들 어 앞의'굶 주 린 사람 식'실현 방식 이지 만 이렇게 되면 일정한 공간 을 낭비 하지 않 습 니까?이러한 실현 방식 은 필요 하 든 필요 하지 않 든 클래스 로 불 러 올 때 대상 을 초기 화 하기 때문이다.
지금 클래스 를 불 러 올 때 대상 을 초기 화하 지 않 는 방법 이 있다 면 문 제 를 해결 할 수 있 지 않 겠 습 니까?하나의 실행 가능 한 방식 은 클래스 내부 클래스 를 사용 하여 이 클래스 내부 클래스 에서 대상 인 스 턴 스 를 만 드 는 것 입 니 다.그러면 이 클래스 내부 클래스 를 사용 하지 않 으 면 대상 인 스 턴 스 를 만 들 지 않 습 니 다.지연 로드 와 스 레 드 안전 을 동시에 실현 합 니 다.
코드 예 시 를 보면 더욱 뚜렷 해 질 수 있 습 니 다.예제 코드 는 다음 과 같 습 니 다.
public class Singleton {
/**
* , ,
* , ,
*/
private static class SingletonHolder{
/**
* , JVM
*/
private static Singleton instance = new Singleton();
}
/**
*
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
곰 곰 이 생각해 보 니 교묘 하지 않 습 니까?
getInstance 방법 이 처음 호출 되 었 을 때 Singleton Holder.intance 를 처음 읽 어서 Singleton Holder 클래스 가 초기 화 되 었 습 니 다.이 종 류 는 불 러 오고 초기 화 될 때 정적 도 메 인 을 초기 화하 여 Singleton 의 인 스 턴 스 를 만 듭 니 다.정적 도 메 인 이기 때문에 가상 컴퓨터 가 클래스 를 불 러 올 때 한 번 만 초기 화 되 고 가상 컴퓨터 로 스 레 드 안전성 을 확보 합 니 다.
이 모델 의 장점 은 getInstance 방법 이 동기 화 되 지 않 았 고 한 도 메 인의 방문 만 실 행 했 기 때문에 초기 화 지연 은 어떠한 방문 비용 도 증가 하지 않 았 다 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.