단일 모드 (게으름뱅이 식, 스 레 드 동기 화 상세 설명)
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 를 사용 할 수 없습니다.
자, 이상 세 가지 끝 났 습 니 다. 여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.