소기 자바 단일 모드 의 각종 실현

2636 단어
단일 모드 는 우리 프로 그래 밍 에서 가장 자주 사용 하 는 디자인 모델 입 니 다.
1. 굶 주 린 법:

public class Singleton {

private static final Singleton instance = new Singleton();

private Singleton(){}

public static Singleton getInstance(){

return instance;

}

}


이것 은 가장 간단 한 방법 으로 클래스 를 인용 할 때 실례 화 된다.로드 를 지연 시 킬 수 없습니다. 어떤 의미 에서 시스템 의 부하 가 증가 합 니 다.
2. 게으름뱅이 법:

public class Singleton {

private static Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

if(instance == null){

instance = new Singleton();

}

return instance;

}

}


배 고 픈 한 법 을 바탕 으로 로드 지연 을 추 가 했 습 니 다. getInstance 를 호출 하 는 방법 만 대상 을 예화 할 수 있 습 니 다. 단일 스 레 드 에 서 는 문제 가 없 지만 다 중 스 레 드 에 서 는 여러 번 예화 할 수 있 습 니 다.
3. 다 중 스 레 드 보안 형:

public class Singleton {

private static volatile Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

return instance;

}

}


instance 대상 에 volatile 키 워드 를 추가 하여 모든 스 레 드 에 대한 가시 성 을 확보 하고 명령 에 대한 정렬 최 적 화 를 금지 합 니 다.null 과 new 를 판단 하 는 부분 에 자 물 쇠 를 추가 합 니 다.그러나 호출 할 때마다 synchronize 잠 금 체 제 를 통 해 줄 을 서서 기다 리 면 효율 적 인 문제 가 생 길 수 있 습 니 다.
4. 다 중 스 레 드 안전성 병행 효율 (이중 검사 자물쇠):

public class Singleton {

private static volatile Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

if(instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}


synchronized 키워드 바깥쪽 에 판단 null 을 추가 하면 null 이후 에 만 방법 에 들 어 갈 수 있 으 며 대부분의 잠 금 동작 을 줄 일 수 있 습 니 다.
= = 주의: volatile 키 워드 는 JDK 1.5 이전에 명령 최적화 정렬 을 완전히 보장 할 수 없 기 때문에 JDK 1.5 이전에 이중 검증 에 문제 가 있 습 니 다 = =
5. 정적 내부 클래스

public class Singleton {

private Singleton(){}

private static class Holder{

private static Singleton instance = new Singleton();

}

public static Singleton getInstance(){

return Holder.instance;

}

}


생 성 과정 을 정적 내부 클래스 에 두 고 정적 내부 클래스 는 호출 될 때 만 불 러 오기 때문에 지연 불 러 오기 에 부합 합 니 다.정적 내부 클래스 는 한 번 만 불 러 오기 때문에 라인 이 안전 합 니 다.
이상 의 모든 방식 은 직렬 화 할 때 추가 작업 (Serializable, transient, readResolve () 이 필요 합 니 다. 그렇지 않 으 면 반 직렬 화 할 때 새로운 인 스 턴 스 를 만 듭 니 다.
6. 매 거 방식:

public enum Singleton {

INSTACE;

private String name;

public String getName() {

return name;

}

}


매 거 진 방식 으로 이 루어 진 단일 모드 를 사용 하여 자체 스 레 드 안전 과 반사 방지 강제 호출 구조 기 를 제공 하고 자동 직렬 화 체 제 를 제공 하여 반 직렬 화 를 방지 할 때 새로운 대상 을 만 듭 니 다.

좋은 웹페이지 즐겨찾기