디자인 모드 - 단일 모드 (계속)
4. 567915. 이 글 에서 단일 모델 에 대해 간단 한 소 개 를 했다. 그 다음 에 본 고 는 주로 여러 가지 모델, 다 중 스 레 드, 이중 검사 와 '불완전' 단일 사례 를 토론 했다.
다 중 모드
다 중 사례 모델 이란 실제 적 으로 단일 사례 모델 의 자연 홍보 이다. 단일 사례 유형 은 일반적인 상황 에서 하나의 사례 만 있 을 수 있 지만 단일 사례 유형 도 유한 한 사례 를 허용 할 수 있다. 이런 모델 은 바로 여러 가지 모델 이다. 그의 주요 특징 은 여러 가지 사례 가 있 을 수 있다 는 것 이다.
다 중 스 레 드
다음 코드 는 스 레 드 동기 화 를 사 용 했 습 니 다. 스 레 드 가 안전 하 다 고 할 수 있 습 니 다. 한 클래스 에 여러 개의 인 스 턴 스 가 나타 나 지 않 습 니 다.synchronized 동기 화가 없 으 면 단일 스 레 드 에 서 는 안전 하지만 다 중 스 레 드 에 서 는 여러 개의 인 스 턴 스 가 나타 날 수 있 습 니 다.
public class LazySingleton
{
private LazySingleton m_instance;
private LazySingleton() { }
// , synchronized
synchronized public static LazySingleton getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}
}
3. 이중 검사
위의 예 를 자세히 살 펴 보 니 동기 화 는 m 에 불과 하 다.인 스 턴 스 가 생 성 되 기 전, 즉 이 방법 을 처음 실 행 했 을 때 성능 이 현저히 떨 어 졌 습 니 다.개선 할 수 있 는 두 가지 방법 이 있다. 하 나 는 굶 주 린 한식 단일 모델 이 고, 다른 하 나 는 이중 검사 다.아래 코드 와 같이:
public class LazySingleton
{
private LazySingleton m_instance;
private LazySingleton() { }
public static LazySingleton getInstance()
{
if (m_instance == null)//first cheak
{
synchronized(this)
{
if (m_instance == null)//second cheak
{
m_instance = new LazySingleton();
}
}
}
return m_instance;
}
}
하지만 '자바 와 모드' 를 보고 나 서 야 안 된다 는 것 을 알 게 되 었 습 니 다. 좋 은 생각 이지 만!성립 되 지 않 는 기본 적 인 원인 은 자바 컴 파일 러 에서 Lazy Singleton 류 의 초기 화 와 minstance 변수 할당 순 서 는 예측 할 수 없습니다.한 스 레 드 가 동기 화 되 지 않 은 조건 에서 m 를 읽 으 면인 스 턴 스 가 이 대상 을 인용 하고 호출 하 는 방법 은 대상 의 초기 화 과정 이 완료 되 지 않 아 붕 괴 될 수 있 습 니 다.
그러나 최신 JSR 133 의 자바 메모리 모델 에 따 르 면 인용 형식 을 volatile 로 설명 하면 이중 검사 모드 가 작 동 할 수 있 습 니 다.다음 과 같다.
public class LazySingleton
{
private volatile LazySingleton m_instance;// volatile
private LazySingleton() { }
public static LazySingleton getInstance()
{
if (m_instance == null)//first cheak
{
synchronized(this)
{
if (m_instance == null)//second cheak
{
m_instance = new LazySingleton();
}
}
}
return m_instance;
}
}
4. 불완전 사례 류
아래 코드 에서 보 듯 이 게으름뱅이 식 단일 사례 처럼 보이 지만 자세히 살 펴 보 니 구조 함수 가 숨 어 있 지 않 았 다.이것 이 바로 불완전 단 례 류 다.
public class LazySingleton
{
private static LazySingleton
m_instance = null;
/**
* ,
*/
public LazySingleton() { } // : public
/**
*
* @return LazySingleton
*/
synchronized public static LazySingleton getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.