1 개요
싱글톤 패턴에는 여러 가지 이점이 있습니다.
(1) 특정 클래스는 더 자주 생성되며 일부 대형 개체의 경우 이는 엄청난 시스템 오버헤드입니다.
(2) new 연산자를 생략하여 시스템 메모리 사용 빈도를 줄이고 GC 부담을 줄입니다.
(3) 거래소의 핵심 거래 엔진과 같은 일부 클래스는 거래 프로세스를 제어합니다. 여러 클래스가 생성되면 시스템이 완전히 엉망이 됩니다.
2 자세한 설명
싱글톤 패턴을 작성하는 데 일반적으로 사용되는 두 가지 방법은 다음과 같습니다.
2.1 배고픈 중국 스타일
애플리케이션이 항상 싱글톤 패턴을 생성하여 사용하거나, 생성 및 런타임 부담이 그다지 높지 않은 경우에는 전용 정적 변수를 사용하여 객체를 미리 생성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 org.scott.singleton;
/**
* @author 스캇
* @버전 2013-11-16
* @설명
*/
공개 클래스 Singleton1 {
private static Singleton1 UniqueInstance = new Singleton1();
개인 싱글턴1(){
}
공개 정적 싱글턴1 getInstance(){
고유 인스턴스를 반환합니다.
}
}
이 경우 JVM이 이 클래스를 로드하면 초기화 순서에 따라 객체가 생성됩니다. 동시에 JVM은 모든 스레드가 이 싱글톤 객체에 액세스하기 전에 먼저 이 인스턴스를 한 번만 생성해야 함을 보장할 수 있습니다.
물론 정적 내부 클래스를 사용하여 동일한 기능을 수행할 수도 있습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 org.scott.singleton;
/**
* @author 스캇
* @버전 2013-11-16
* @설명
*/
공개 클래스 Singleton2 {
개인 싱글턴2() {
}
/**
* 여기서는 싱글톤을 유지하기 위해 내부 클래스가 사용됩니다.
* */
개인 정적 클래스 SingletonFactory {
private static Singleton2 인스턴스 = new Singleton2();
}
공개 정적 Singleton2 getInstance() {
SingletonFactory.instance를 반환합니다.
}
/**
* 객체가 직렬화에 사용되는 경우 직렬화 전후에 객체의 일관성이 유지된다는 것을 보장할 수 있습니다.
* */
공공 객체 readResolve() {
getInstance()를 반환합니다.
}
}
2.2 이중 잠금 방식
"이중 잠금"은 이름에서 알 수 있듯이 두 개의 잠금을 사용하여 생성할 인스턴스 개체가 생성되었는지 확인하는 데 사용되며, 생성되지 않은 경우 두 번째 잠금을 사용하여 동기화합니다.
다음과 같이 코드 코드를 복사합니다.
패키지 org.scott.singleton;
/**
* @author 스캇
* @버전 2013-11-16
* @설명
*/
공개 클래스 Singleton3 {
개인 휘발성 정적 Singleton3 UniqueInstance;
개인 싱글턴3(){
}
공개 정적 Singleton3 getInstance(){
if(uniqueInstance == null){
동기화됨(Singleton3.class){
if(uniqueInstance == null){
UniqueInstance = new Singleton3();
}
}
}
고유 인스턴스를 반환합니다.
}
}
성능 요구 사항이 상대적으로 높은 경우 이 방법을 사용하면 생성 시간을 크게 줄일 수 있으며 현재 이 방법은 싱글톤을 만드는 데에도 비교적 일반적인 방법입니다.