이학 단 례 모델
12212 단어 프로 그래 밍 사상
아이고!일례 로 모두 잘못 배 웠 는데, 무슨 배 울 것 이 있 느 냐?
오늘 '헤드 퍼스트 디자인 모드' 를 보고 디 테 일 한 부분 을 봤 기 때문에 단 례 를 재인 식 하기 로 했 습 니 다.
응용 장면
일반적인 일례
우리 먼저 보 자.
public Single{
private static Single singleInstance;
private Single(){}
public static Single getSingleInstance(){
if(singleInstance == null){
singleInstance = new Single();
}
return singleInstance;
}
}
아주 간단 한 예 입 니 다. 모두 가 쓰 고 구 조 를 숨 기 고 방법 을 폭로 합 니 다.
그러나 이것 은 다 중 스 레 드 와 관련 된 것 입 니 다. 만약 에 제 가 두 스 레 드 가 동시에 도착 하면
if(singleInstance == null)
어떻게 합 니까? 이것 은 서로 다른 대상 이 나 올 것 입 니 다. 이것 은 안전 하지 않 습 니 다. 그러면 어떻게 합 니까?스 레 드 보안
다 중 스 레 드 문 제 를 처리 하 는 데 우 리 는 세 가지 방법 이 있다.
방법 1: new 를 앞 당 기 는 것 이 좋다.
코드 가 구리다 고 생각 하지 마 세 요.
public Single{
private static Single singleInstance = new Single();
private Single(){}
public static Single getSingleInstance(){
return singleInstance;
}
}
JVM 에서 이 클래스 를 불 러 오 면 바로 이 대상 을 만 들 수 있 습 니 다.만약 창설 과 운행 방면 에 있어 서 스트레스 가 크 지 않다 면, 너 는 또 급히 써 야 한다. 확실히 이렇게 할 수 있다
방법 2: 동기 화 (synchronized) 블록 추가
기억 나 세 요?
public Single{
private static Single singleInstance;
private Single(){}
public static synchronized Single getSingleInstance(){
if(singleInstance == null){
singleInstance = new Single();
}
return singleInstance;
}
}
방법 중간 에
synchronized
키 워드 를 더 하면 문 제 는 해결 되 었 습 니 다. 그러나 제 대상 이 모두 만 들 어 졌 다 면 저 는 바로 가 져 갈 수 있 습 니 다. 어디 에 두 고 기다 리 겠 습 니까?그래서 그 에 따 른 것 은 성능 의 재난 이다.방법 3: 동기 화 감소, 이중 잠 금 DCL 사용 (Double - Checked Lock)
먼저 하나의 대상 이 만 들 어 졌 는 지, 만 들 지 않 았 는 지, 다시 동기 화 되 었 는 지 확인 하 십시오. 무작정 모두 동기 화 되 었 습 니 다.
public Single{
private volatile static Single singleInstance;
private Single(){}
public static Single getSingleInstance(){
if(singleInstance == null){
synchronized(Single.class){
if(singleInstance == null){
singleInstance = new Single();
}
}
}
return singleInstance;
}
}
이중 잠 금 메커니즘, 성능 이용
단일 예 vs 전역 변수
제 '2 학 static' 의 예 를 기억 하 십 니까?
//Code.1
public Single{
static public void FuncA(Object o);
static public void FuncB(Object o);
static public void FuncC(Object o);
}
// Code.2
public Single{
private static Single singleInstance;
private Single(){}
public static Single getSingleInstance(){
if(singleInstance == null){
singleInstance = new Single();
}
return singleInstance;
}
public void FuncA(Object o);
public void FuncB(Object o);
public void FuncC(Object o);
}
// FuncA
Object o = new Object();
// call 1
Single.FuncA(o);
// call 2
Single.getSingleInstance().FuncA(o);
내 가 이전에 말 한 것 과 달리 초기 화 와 통제 권 이 다른 문제 도 존재 한다.
초기 화