어떻게 효율 적 으로 단일 모델 을 실현 합 니까?

2296 단어
대상 언어 개발 에서 단일 모델 은 23 가지 디자인 모델 중에서 가장 간단 한 디자인 모델 로 서 우리 에 게 낯 설 지 않 지만 단일 모델 을 어떻게 정확 하고 효율적으로 실현 하 는 지 우리 에 게 는 잘 고려 해 야 한다.
첫 번 째 단일 모드:
public class SingletonInstance {

private static SingletonInstance instance;

private SingletonInstance() {
}

public static SingletonInstance getInstance() {
    if (instance == null) {
        instance = new SingletonInstance();
    }
    return instance;
}
}

우 리 는 대부분 이런 코드 를 썼 기 때문에 모두 가 이 코드 에 대해 낯 설 지 않다 고 믿는다.그러나 이러한 쓰기 방법 은 매우 뚜렷 한 결함 을 가 져 올 수 있 습 니 다. 우리 가 다 중 스 레 드 에서 이 코드 를 실행 할 때 적어도 두 개의 스 레 드 가 getInstance () 방법 을 실 행 했 고 모두 intance 에 대해 결 과 를 null 로 판단 하면 이 때 적어도 두 개의 Singleton Instance 인 스 턴 스 인 스 턴 스 가 발생 합 니 다.그래서 엄격 한 의미 에서 볼 때 이런 문법 은 정확 하지 않다.
다음은 두 번 째 글 씨 를 보 겠 습 니 다.
public class SingletonInstance {

private static SingletonInstance instance;

private SingletonInstance() {
}

public synchronized static SingletonInstance getInstance() {
    if (instance == null) {
        instance = new SingletonInstance();
    }
    return instance;
}
}

이런 방법 도 우리 가 비교적 쉽게 생각 할 수 있 는 것 이다. 이런 표기 법 은 정확성 원칙 을 만족 시 켰 지만 빈번 한 잠 금 조작 도 우리 의 코드 를 효율 적 이지 못 하 게 할 것 이다. 어떻게 하면 정확 하면 서도 효율 적 인 표기 법 을 보장 할 수 있 을 까?
우 리 는 세 번 째 실현 을 계속 살 펴 보 았 다.
public class SingletonInstance {

private static SingletonInstance instance;
private static Object syncObj = new Object();


private SingletonInstance() {
}

public static SingletonInstance getInstance() {
    if (instance == null) {
        synchronized (syncObj) {
            if (instance == null) {
                instance = new SingletonInstance();
            }
        }
    }
    return instance;
}
}

이러한 표기 법 은 두 번 째 실현 방식 에 대한 개선 이다. 즉, 싱글 톤 인 스 턴 스 인 스 턴 스 인 스 턴 스 를 처음 얻 었 을 때 만 잠 금 작업 을 할 수 있 고 대체적으로 효율 적 인 표기 법 에 이 르 렀 다.
다음은 네 번 째 실현 방식 을 살 펴 보 자.
public class SingletonInstance {

private static SingletonInstance instance = new SingletonInstance();

private SingletonInstance() {
}

public static SingletonInstance getInstance() {
    return instance;
}
}

앞의 몇 가지 실현 방식 에 비해 이런 표기 법 은 가장 효율 적 인 편 이다. jvm 클래스 캐리어 가 싱글 톤 인 스 턴 스 를 불 러 올 때 이미 싱글 톤 인 스 턴 스 실례 를 생 성 했다.그래서 우리 가 getInstance () 를 호출 할 때 도 인 스 턴 스 가 null 인 경 우 는 존재 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기