단일 모드 (게으름뱅이 식, 스 레 드 동기 화 상세 설명)

3727 단어 디자인 모드
단일 모드 (게으름뱅이 식)
게으름뱅이 쓰기 에서 우 리 는 스 레 드 동기 화 문제 에 매우 주의해 야 합 니 다. 대략 몇 가지 가 있 습 니 다. 1. getInstance () 직접 잠 그 는 방법 이 좋 습 니까? 2. 이중 잠 금 3. synchronized (this) 가 괜 찮 습 니까?
1. getInstance () 직접 잠 그 는 방법
이런 표기 법:
class Singleton {
    private static Singleton instance;
    private Singleton(){}

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

이 synchronized 는 잠 금 방법 입 니 다. 두 스 레 드 가 모두 getInstance () 에 들 어 갈 때 한 개 만 들 어 갈 수 있 고 인 스 턴 스 를 만 들 수 있 습 니 다. 그리고 다른 하 나 는 들 어가 서 인 스 턴 스 가 null 이 아니 라 인 스 턴 스 를 직접 얻 을 수 있 습 니 다. 이 방법 은 잘못 되 지 않 았 습 니 다. 하지만 스 레 드 는 getInstance () 를 통 해 대상 을 가 져 와 야 하기 때문에 getInstance ()호출 빈도 가 매우 높 기 때문에 스 레 드 가 잠 겨 있 는 빈도 도 매우 높 기 때문에 이런 방법 은 효율 이 낮다.
2. 이중 잠 금
위의 효율 적 인 이유 로 syschronized 를 getInstance () 에 넣 으 면 getInstance () 를 호출 할 때 차단 하 는 문 제 를 피 할 수 있 습 니 다. 다음 과 같 습 니 다.
class Singleton {
    private static Singleton instance;
    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                instance = new Singleton();
            }
        }
        return instance;
    }
}

이러한 표기 법 은 문제 가 없 는 것 처럼 보이 지만 큰 위험 이 있 습 니 다. 만약 에 두 스 레 드 가 getInstance () 를 동시에 실행 하면 인 스 턴 스 가 null 이 아니 라 if 판단 문 에 들 어간 후에 if 판단 문 에 들 어 갑 니 다. 이때 한 스 레 드 가 자 물 쇠 를 얻 은 다음 에 new 에 들 어가 서 한 대상 을 즐겁게 실 행 했 습 니 다. 이때 다른 스 레 드 는 자 물 쇠 를 얻 었 습 니 다.그러나 인 스 턴 스 가 null 인지 아 닌 지 를 판단 하지 못 하 게 하기 때문에 new 작업 을 한 번 더 수행 합 니 다. 그래서 여기 서 new 작업 을 두 번 실 행 했 습 니 다. 물론 마지막 인 스 턴 스 는 다음 new 대상 만 가리 키 고 있 습 니 다. 따라서 이 때 는 이중 잠 금 이 필요 합 니 다. synchronized 에서 null 판단 을 한 번 더 하 는 것 입 니 다. 다음 과 같 습 니 다.
class Singleton {
    private static Singleton instance;
    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

이렇게 하면 new 두 번 이 아니 라 상대 적 으로 정확 하고 효율 도 높다 는 것 을 보증 할 수 있다.
3. synchronized (this) 되 나 요
답 은 안 됩 니 다. 코드 를 써 서 보면 문법 이 틀 렸 습 니 다. 저희 getInstance () 방법 은 static 이기 때문에 안에 this 를 사용 할 수 없습니다.
자, 이상 세 가지 끝 났 습 니 다. 여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기