단일 모드 의 이중 잠 금 원리

왜 다 중 스 레 드 에서 단일 모드 를 만 들 때 이중 잠 금 을 해 야 합 니까?이중 잠 겨 있 는 코드 블록 을 살 펴 보 세 요.
public class SingleTon {
   
    private static SingleTon singleTon = null;
   
       
    public SingleTon() {
        // TODO Auto-generated constructor stub
    }
   
   
    public static SingleTon getInstance(){
        if (singleTon == null) {
            synchronized (SingleTon.class) {
                if (singleTon == null) {
                    singleTon = new SingleTon();
                }
            }
        }
        return singleTon;
    }

}

왜 이중 검 사 를 사용 하여 잠 금 을 해 야 합 니까?위의 글 은 이미 대충 한 번 말 했다.
이러한 상황 을 고려 하면 두 개의 스 레 드 가 동시에 도착 하 는 것 이다. 즉, getInstance () 방법 을 동시에 호출 하 는 것 이다.
이 때 singleTon = = null, 그래서 두 스 레 드 모두 첫 번 째 무 거 운 것 을 통과 할 수 있 음 이 분명 합 니 다. singleTon == null ,
첫 번 째 if 문장 에 들 어간 후 자물쇠 메커니즘 이 존재 하기 때문에 하나의 라인 이 lock 문장 에 들 어가 고 두 번 째 문장 에 들 어 갑 니 다 singleTon == null ,
다른 스 레 드 는 lock 문장의 밖에서 기다 릴 것 입 니 다.
첫 번 째 스 레 드 가 new 를 실행 하면  SingleTon () 문 구 를 사용 하면 잠 금 영역 을 종료 합 니 다. 이때 두 번 째 스 레 드 는 lock 구문 블록 에 들 어 갈 수 있 습 니 다.
이때 두 번 째 무게 가 없다 면 singleTon = = null 이면 두 번 째 스 레 드 는 new 를 호출 할 수 있 습 니 다.  singleTon () 문장,
이렇게 두 번 째 스 레 드 도 하나 만 들 거 예요. 싱글 톤 인 스 턴 스, 이것 도 하나의 사례 모델 의 취지 에 어 긋 난다.
그래서 여 기 는 잠 금 검 사 를 이중 으로 해 야 합 니 다.
세심 한 친 구 는 내 가 첫 번 째 singleton = null 을 제거 하면 프로그램 이 다 중 스 레 드 에서 잘 실 행 될 수 있다 는 것 을 알 게 될 것 이다.
첫 번 째 싱글 톤 = = null 이 없 는 상황 에서
두 개의 라인 이 동시에 도착 하면 lock 메커니즘 이 존재 하기 때문에 첫 번 째 라인 은 lock 문장 블록 에 들 어가 고 new SingleTon () 을 순조롭게 실행 할 수 있 습 니 다.
첫 번 째 스 레 드 가 lock 구문 블록 을 종료 할 때 singleTon 이라는 정적 변 수 는 null 이 아니 기 때문에 두 번 째 스 레 드 가 lock 에 들 어 갈 때,
아니면 두 번 째 singleton = = null 에 의 해 밖 에 가 려 져 new Singleton () 을 실행 할 수 없습니다.
그래서 첫 번 째 singleton = = null 이 없 는 상황 에서 도 단일 모드 를 실현 할 수 있 습 니까?그렇다면 왜 1 중 singleton = = null 이 필요 할 까?
여기 서 성능 문제 가 발생 했 습 니 다. 단일 모드 에 대해 서 는 new SingleTon () 이 한 번 만 실행 하면 되 기 때 문 입 니 다.
첫 번 째 singleTon = = null 이 없 으 면 getInstance () 에 들 어 갈 때마다 잠 금 동작 을 실행 하여 스 레 드 동기 화 를 실현 합 니 다.
이것 은 매우 성능 을 소모 하 는 것 이다. 만약 내 가 첫 번 째 싱글 톤 = null 을 더 하면...
그러면 첫 번 째, 즉 singleTton = = null 이 설립 되 었 을 때 한 번 의 잠 금 을 실행 하여 스 레 드 동기 화 를 실현 합 니 다.
이후 에는 싱글 톤 인 스 턴 스 로 바로 돌아 가면 OK 이 고 lock 구문 블록 에 들 어가 지 않 아 도 됩 니 다. 그러면 스 레 드 동기 화 에 따 른 성능 문 제 를 해결 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기