3. Singleton 단일 모드
1. 정의
어떤 종류가 하나의 실례만 있을 뿐만 아니라, 자체적으로 실례화하여 전체 시스템에 이 실례를 제공하도록 확보하다
2. 특징
3. 단일 모델은 게으름뱅이와 굶주림식으로 나눌 수 있다
1) 게으름뱅이식, 노정이 안전하지 않다
이런 방식은 가장 기본적인 실현 방식이다. 이런 실현의 가장 큰 문제는 다선정을 지원하지 않는 것이다.synchronized를 잠그지 않았기 때문에 엄격한 의미에서 이것은 단일 모드가 아니다.
public class SingletonDemo1 {
private static SingletonDemo1 instance;
private SingletonDemo1(){}
public static SingletonDemo1 getInstance(){
if (instance == null) {
instance = new SingletonDemo1();
}
return instance;
}
}
2) 게으름뱅이식, 라인 안전
public class SingletonDemo2 {
private static SingletonDemo2 instance;
private SingletonDemo2(){}
public static synchronized SingletonDemo2 getInstance(){
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
}
3) 아사자식
classloder 메커니즘을 바탕으로 여러 라인의 동기화 문제를 피했지만, instance는 클래스를 불러올 때 실례화되었고, 이때 instance를 초기화하는 것은lazy loading 효과에 이르지 못했다.
public class SingletonDemo3 {
private static SingletonDemo3 instance = new SingletonDemo3();
private SingletonDemo3(){}
public static SingletonDemo3 getInstance(){
return instance;
}
}
4) 아사자, 변종
클래스 초기화 즉 실례화 instance
public class SingletonDemo4 {
private static SingletonDemo4 instance = null;
static{
instance = new SingletonDemo4();
}
private SingletonDemo4(){}
public static SingletonDemo4 getInstance(){
return instance;
}
}
5) 등록식/정적 내부 클래스
이런 방식은 쌍검쇄 방식과 같은 효능을 얻을 수 있지만 실현은 더욱 간단하다.정적 영역에 대해 지연 초기화를 사용하려면 이중 잠금 방식이 아니라 이런 방식을 사용해야 한다.이런 방식은 정적 영역의 경우에만 적용되며, 이중 잠금 방식은 실례 영역이 초기화를 지연할 때 사용할 수 있다.
public class SingletonDemo5 {
private static class SingletonHolder{
private static final SingletonDemo5 instance = new SingletonDemo5();
}
private SingletonDemo5(){}
public static final SingletonDemo5 getInsatance(){
return SingletonHolder.instance;
}
}
6) 열거
자동적으로 서열화 메커니즘을 지원하여 여러 차례의 실례화를 절대 방지한다.
public enum SingletonDemo6 {
instance;
public void whateverMethod(){
}
}
7) 이중 잠금/이중 잠금(DCL, 즉 Double-checked locking)
이런 방식은 이중 잠금 메커니즘을 채택하여 안전하고 다선정 상황에서 고성능을 유지할 수 있다
public class SingletonDemo7 {
private volatile static SingletonDemo7 singletonDemo7;
private SingletonDemo7(){}
public static SingletonDemo7 getSingletonDemo7(){
if (singletonDemo7 == null) {
synchronized (SingletonDemo7.class) {
if (singletonDemo7 == null) {
singletonDemo7 = new SingletonDemo7();
}
}
}
return singletonDemo7;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.