단일 모드 상세 설명
18794 단어 디자인 모드
소개
굶 주 린 한식
가장 간단 한 굶 주 린 사람
상기 코드 를 최적화 하 다.
게으름뱅이
다 중 스 레 드 가 안전 하지 않 습 니 다.
다 중 스 레 드 안전
더 블 체크 잠 금/더 블 체크 잠 금(DCL,즉 double-checked locking)등록 식/정적 내부 클래스
총화
소개 하 다.
단일 모드(Singleton Pattern)는 자바 에서 가장 간단 한 디자인 모델 중 하나 이다.이런 유형의 디자인 모델 은 창설 형 모델 에 속 하 는데,이것 은 창설 대상 을 만 드 는 가장 좋 은 방법 을 제공한다.
이 모델 은 하나의 단일 클래스 와 관련 되 는데 이 클래스 는 자신의 대상 을 만 드 는 것 을 책임 지고 하나의 대상 만 생 성 되 는 것 을 확보한다.이 종 류 는 유일한 대상 을 방문 하 는 방식 을 제공 하여 직접 방문 할 수 있 으 며,이러한 대상 을 예화 할 필요 가 없다.
주의:
1.단일 클래스 는 하나의 인 스 턴 스 만 있 을 수 있 습 니 다.2.단일 사례 류 는 자신 이 자신의 유일한 인 스 턴 스 를 만들어 야 합 니 다.3.단일 클래스 는 모든 다른 대상 에 게 이 인 스 턴 스 를 제공 해 야 합 니 다.
의도:하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
주요 해결:전역 적 으로 사용 되 는 클래스 를 자주 만 들 고 소각 합 니 다.
언제 사용 합 니까?인 스 턴 스 수 를 제어 하고 시스템 자원 을 절약 하려 고 할 때.
어떻게 해결 합 니까?시스템 에 이미 이 사례 가 있 는 지 판단 하고 있 으 면 되 돌아 가 고 없 으 면 만 듭 니 다.
핵심 코드:구조 함 수 는 개인 적 인 것 입 니 다.
인 스 턴 스 적용:
1.한 반 에 담임 선생님 이 한 명 밖 에 없어 요.2.Windows 는 다 중 프로 세 스 다 중 스 레 드 입 니 다.한 파일 을 조작 할 때 여러 프로 세 스 나 스 레 드 가 한 파일 을 동시에 조작 하 는 현상 이 불가피 하기 때문에 모든 파일 의 처 리 는 유일한 인 스 턴 스 를 통 해 이 루어 져 야 합 니 다.3.일부 장치 관리 자 는 하나의 컴퓨터 에 프린터 가 두 대 있 고 출력 할 때 두 대의 프린터 가 같은 파일 을 인쇄 할 수 없 도록 단일 모드 로 설계 합 니 다.장점:
1.메모리 에 하나의 인 스 턴 스 만 있 고 메모리 의 비용 을 줄 였 습 니 다.특히 인 스 턴 스 를 자주 만 들 고 소각 합 니 다(예 를 들 어 관리 대학의 첫 페이지 캐 시).2.자원 에 대한 다 중 점용 을 피한다(예 를 들 어 파일 쓰기 작업).단점:인터페이스 가 없 으 면 계승 할 수 없고 단일 직책 원칙 과 충돌 하 며 한 가 지 는 내부 논리 에 만 관심 을 가 져 야 하 며 밖에서 어떻게 예화 하 는 지 에 관심 을 가 져 야 한다.
사용 필드:
1.유일한 일련 번 호 를 생산 하도록 요구한다.2.WEB 의 계수 기 는 새로 고침 할 때마다 데이터베이스 에 한 번 추가 하지 않 고 단일 사례 로 먼저 캐 시 합 니 다.3.한 대상 을 만 드 는 데 소모 되 는 자원 이 너무 많 습 니 다.예 를 들 어 I/O 와 데이터 베 이 스 를 연결 하 는 등 입 니 다.주의사항:getInstance()방법 에 서 는 동기 화 잠 금 synchronized(Singleton.class)를 사용 하여 다 중 스 레 드 가 동시에 들 어가 인 스 턴 스 가 여러 번 예화 되 는 것 을 방지 해 야 합 니 다.
굶 주 린 사람 식
Lazy 초기 화 여부:여부
다 중 스 레 드 안전 여부:예
실현 난이도:쉬 움
설명:이런 방식 은 비교적 자주 사용 되 지만 쓰레기 대상 이 생기 기 쉽다.장점:자 물 쇠 를 채 우지 않 으 면 집행 효율 이 높아진다.단점:클래스 로 딩 시 초기 화,메모리 낭비.이 는 classloader 체 제 를 바탕 으로 다 중 스 레 드 의 동기 화 문 제 를 피 할 수 있 습 니 다.그러나 인 스 턴 스 는 클래스 를 불 러 올 때 예화 되 었 습 니 다.클래스 를 불 러 오 는 원인 은 여러 가지 가 있 지만 단일 모드 에서 대부분 getInstance 방법 을 호출 하지만 다른 방식(또는 다른 정적 방법)으로 클래스 를 불 러 올 수 있 는 지 는 확실 하지 않 습 니 다.이때 인 스 턴 스 를 초기 화 하 는 것 은 분명히 lazy loading 의 효과 에 이 르 지 못 했다.JVM 에 서 는 기본적으로 스 레 드 가 안전 합 니 다.
일반적으로 굶 주 린 한식 을 사용 하 는 것 을 권장 합 니 다.
가장 간단 한 굶 주 린 사람
public class SingletonDemo {
//
public static SingletonDemo myInstance = new SingletonDemo();
//
private SingletonDemo(){
}
}
테스트 코드:결과 true
@Test
public void test(){
SingletonDemo single1 = SingletonDemo.myInstance;
SingletonDemo single2 = SingletonDemo.myInstance;
SingletonDemo single3 = SingletonDemo.myInstance;
System.out.println(single1 == single2);
System.out.println(single3 == single2);
}
설명:결 과 는 모두 true 이 고 하나의 예 로 설명 하 며 false 라면 하나의 예 가 아니다.
상기 코드 를 최적화 하 다.
public class SingletonDemo {
//
private static SingletonDemo myInstance = new SingletonDemo();
//
private SingletonDemo(){
}
//
public static SingletonDemo getMyInstance() {
// ...
return myInstance;
}
}
테스트 코드:
@Test
public void test(){
SingletonDemo single1 = SingletonDemo.getMyInstance();
SingletonDemo single2 = SingletonDemo.getMyInstance();
SingletonDemo single3 = SingletonDemo.getMyInstance();
System.out.println(single1 == single2);
System.out.println(single3 == single2);
}
게으름뱅이 식
다 중 스 레 드 가 안전 하지 않 습 니 다.
이런 방식 은 가장 기본 적 인 실현 방식 으로 이런 실현 의 가장 큰 문 제 는 다 중 스 레 드 를 지원 하지 않 는 것 이다.잠 금 synchronized 가 없 기 때문에 엄격 한 의미 에서 단일 모드 가 아 닙 니 다.이런 방식 은 lazy loading 이 뚜렷 해서 라인 의 안전 을 요구 하지 않 고 다 중 라인 에서 정상적으로 작 동 하지 못 한다.
public class LazySingleton {
// , ,
private static LazySingleton lazySingle;
//
private LazySingleton() {
}
//
public static LazySingleton getLazySingle() {
// ...
if (lazySingle == null) {
lazySingle = new LazySingleton();
}
return lazySingle;
}
}
테스트 코드:결과 true
public class LazyTest {
@Test
public void test(){
LazySingleton lazy1 = LazySingleton.getLazySingle();
LazySingleton lazy2 = LazySingleton.getLazySingle();
System.out.println(lazy1 == lazy2);
}
}
대외 방법 코드 가 이러 면 단일 사례 가 아니 라 false 입 니 다.
public static LazySingleton getLazySingle() {
lazySingle = new LazySingleton();
return lazySingle;
}
다 중 스 레 드 보안
이런 방식 은 매우 좋 은 lazy loading 을 갖 추고 있어 다 중 스 레 드 에서 좋 은 작업 을 할 수 있 지만 효율 이 낮 고 99%의 상황 에서 동기 화 할 필요 가 없다.장점:첫 번 째 호출 에서 야 초기 화 되 어 메모리 낭 비 를 피 할 수 있 습 니 다.단점:잠 금 synchronized 를 추가 해 야 단일 예 를 보장 할 수 있 지만 잠 금 을 추가 하면 효율 에 영향 을 줄 수 있 습 니 다.getInstance()의 성능 은 응용 프로그램 에 그다지 중요 하지 않 습 니 다.
// ( )
public synchronized static LazySingleton getLazyInstace(){
if (lazySingle == null) {
lazySingle = new LazySingleton();
}
return lazySingle;
}
더 블 체크 잠 금/더 블 체크 잠 금(DCL,즉 double-checked locking)
JDK 버 전:JDK 1.5 부터
Lazy 초기 화 여부:예
다 중 스 레 드 안전 여부:예
실현 난이도:비교적 복잡
설명:이런 방식 은 이중 잠 금 체 제 를 사용 하여 안전 하고 다 중 스 레 드 상황 에서 고성능 을 유지 할 수 있 습 니 다.getInstance()의 성능 은 응용 프로그램 에 매우 중요 하 다.
//
public static LazySingleton getLazyDCL() {
if (lazySingle == null) {
synchronized (LazySingleton.class) {
if (lazySingle == null) {
lazySingle = new LazySingleton();
}
}
}
return lazySingle;
}
등록 식/정적 내부 클래스
Lazy 초기 화 여부:예
다 중 스 레 드 안전 여부:예
실현 난이도:일반
설명:이런 방식 은 쌍 검 자물쇠 방식 과 같은 효 과 를 얻 을 수 있 지만 실현 은 더욱 간단 하 다.정적 도 메 인 사용 지연 초기 화 는 이중 잠 금 방식 이 아 닌 이 방식 을 사용 해 야 합 니 다.이 방식 은 정적 도 메 인 에 만 적 용 됩 니 다.더 블 잠 금 방식 은 인 스 턴 스 도 메 인 에서 초기 화 지연 이 필요 할 때 사용 할 수 있 습 니 다.이 방식 역시 classloader 체 제 를 이용 하여 intance 를 초기 화 할 때 하나의 스 레 드 만 있 도록 합 니 다.세 번 째 방식 과 달리 세 번 째 방식 은 Singleton 류 가 불 러 오 면 intance 는 정례 화 됩 니 다(lazy loading 효과 에 이 르 지 못 했 습 니 다).이런 방식 은 Singleton 류 가 불 러 오 는 것 입 니 다.intance 가 반드시 초기 화 되 는 것 은 아 닙 니 다.Singleton Holder 클래스 가 주동 적 으로 사용 되 지 않 았 기 때문에 getInstance 방법 을 명시 적 으로 호출 할 때 만 Singleton Holder 클래스 를 명시 적 으로 불 러 와 인 스 턴 스 를 예화 할 수 있 습 니 다.실례 화 인 스 턴 스 가 자원 을 소모 하기 때문에 로 딩 을 지연 시 키 고 싶 습 니 다.다른 한편,Singleton 류 로 딩 할 때 실례 화 하 는 것 을 원 하지 않 습 니 다.Singleton 류 가 다른 곳 에서 주동 적 으로 사용 되 어 로 딩 될 수 있다 는 것 을 확보 하지 못 하기 때문에 이 럴 때 실례 화 인 스 턴 스 는 적절 하지 않 습 니 다.이때 이런 방식 은 세 번 째 방식 에 비해 합리적이다.
public class LazySingletonClass {
private LazySingletonClass() {
}
private static class Inner {
private static LazySingletonClass lazyton = new LazySingletonClass();
}
public static LazySingletonClass getLazyclass() {
return Inner.lazyton;
}
}
총결산
경험 담:일반적인 상황 에서 첫 번 째 와 두 번 째 게으름뱅이 방식 을 사용 하 는 것 을 권장 하지 않 고 굶 주 린 사람 방식 을 사용 하 는 것 을 권장 합 니 다.lazy loading 효 과 를 명확 하 게 실현 하려 면 등록 식/정적 내부 클래스 방식 을 사용 해 야 합 니 다.반 직렬 화 생 성 대상 과 관련 이 있 을 때 매 거 진 방식 을 사용 해 볼 수 있 습 니 다.다른 특별한 수요 가 있다 면,더 블 잠 금 방식 을 고려 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.