자바-싱글 톤 단일 모드
창조 형 모델
1
“ ”
간단 한 소개
단일 모드 는 하나의 단일 클래스 와 관련 되 는데 이 클래스 는 자신의 대상 을 만 드 는 것 을 책임 지고 하나의 대상 만 생 성 되 는 것 을 확보한다.이 종 류 는 유일한 대상 을 방문 하 는 방식 을 제공 하여 직접 방문 할 수 있 으 며,이러한 대상 을 예화 할 필요 가 없다.
주의 하 다.
쓸모
인 스 턴 스 수 를 제어 하고 시스템 자원 을 절약 하려 고 할 때.전역 적 으로 사용 되 는 클래스 의 빈번 한 창설 과 소각 문 제 를 해결 할 수 있다.
간단 한 예
기초 예시
public class SingleObject {
/**
* SingleObject
*/
private static SingleObject instance = new SingleObject();
/**
* private,
*/
private SingleObject(){}
/**
*
* @return
*/
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
public class SingletonPatternDemo {
public static void main(String[] args) {
//
// : SingleObject()
//SingleObject object = new SingleObject();
//
SingleObject object = SingleObject.getInstance();
//
object.showMessage();
}
}
Hello World!
게으름뱅이 식(라인 이 안전 하지 않 음)
Lazy 초기 화:다 중 스 레 드 보안 여부
。 synchronized, 。
이런 방식 은 lazy loading 이 뚜렷 하고 스 레 드 안전 을 요구 하지 않 으 며 。
에 있 습 니 다.public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
게으름뱅이 식(스 레 드 안전)
Lazy 초기 화:다 중 스 레 드 안전:이런 방식 으로 좋 은 lazy loading(게 으 름 로드)을 갖 추고 다 중 스 레 드 에서 좋 은 작업 을 할 수 있 지만 효율 이 낮 고 99%의 경우 동기 화 할 필요 가 없습니다.
public class Singleton1 {
private static Singleton1 instance;
private Singleton1 (){}
/**
* ( synchronized )
* @return
*/
public static synchronized Singleton1 getInstance() {
if (instance == null) {
instance = new Singleton1();
}
return instance;
}
}
굶 주 린 사람 식
Lazy 초기 화:다 중 스 레 드 안전:이런 방식
이지 만
입 니 다. classloader , ,instance , , getInstance , ( ) , instance lazy loading 。
public class Singleton2 {
// instance
private static Singleton2 instance = new Singleton2();
private Singleton2 (){}
public static Singleton2 getInstance() {
return instance;
}
}
이중 검색/이중 검사 잠 금(DCL,즉 double-checked locking)
JDK 버 전:1.5 기 Lazy 초기 화:다 중 스 레 드 보안:이러한 방식 으로
, 。
getInstance()의 성능 이 응용 프로그램 에 매우 중요 합 니 다.public class Singleton3 {
/**
* volatile ,
*/
private volatile static Singleton3 Singleton3;
private Singleton3 (){}
public static Singleton3 getSingleton3() {
if (Singleton3 == null) {
/**
* synchronized 。
*/
synchronized (Singleton3.class) {
if (Singleton3 == null) {
Singleton3 = new Singleton3();
}
}
}
return Singleton3;
}
}
등록 식/정적 내부 클래스
Lazy 초기 화:다 중 스 레 드 보안 입 니 다.
, 。
쌍 의 정적 도 메 인 사용 지연 초기 화 입 니 다.이중 잠 금 방식 이 아 닌 이 방식 을 사용 해 야 합 니 다.이 방식 은 정적 도 메 인 에 만 적 용 됩 니 다.더 블 잠 금 방식 은 인 스 턴 스 도 메 인 에서 초기 화 지연 이 필요 할 때 사용 할 수 있 습 니 다.이러한 방식 역시 classloader 체 제 를 이용 하여 intance 를 초기 화 할 때 하나의 스 레 드 만 있 도록 합 니 다.
번 째 방식 과 달리
방식 은 Singleton 류 가 불 러 오 면 intance 는 정례 화 됩 니 다(lazy loading 효과 에 이 르 지 못 함).이런 방식 은 Singleton 류 가 불 러 옵 니 다.instance 가 반드시 초기 화 되 는 것 은 아 닙 니 다.Singleton Holder 클래스 가 주동 적 으로 사용 되 지 않 았 기 때문에 getInstance 방법 을 명시 적 으로 호출 할 때 만 Singleton Holder 클래스 를 명시 적 으로 불 러 와 인 스 턴 스 를 예화 할 수 있 습 니 다.실례 화 인 스 턴 스 가 자원 을 소모 하기 때문에 로 딩 을 지연 시 키 고 싶 습 니 다.다른 한편,Singleton 류 로 딩 할 때 실례 화 하 는 것 을 원 하지 않 습 니 다.Singleton 류 가 다른 곳 에서 주동 적 으로 사용 되 어 로 딩 될 수 있다 는 것 을 확보 하지 못 하기 때문에 이 럴 때 실례 화 인 스 턴 스 는 적절 하지 않 습 니 다.이때 이런 방식 은
방식 에 비해 매우 합리적이다.public class Singleton4 {
private static class Singleton4Holder {
private static final Singleton4 INSTANCE = new Singleton4();
}
private Singleton4 (){}
/**
* Singleton , INSTANCE, getInstance() , 。
* @return
*/
public static final Singleton4 getInstance() {
return Singleton4Holder.INSTANCE;
}
}
매 거
Lazy 초기 화:다 중 스 레 드 안전 여부:
[runoob ]
입 니 다.그것 은 더욱 간결 하고 직렬 화 체 제 를 자동 으로 지원 하 며 여러 번 의 정례 화 를 절대적 으로 방지한다.이런 방식 은 Effective Java 작가 Josh Bloch 가 제창 하 는 방식 으로 , , , 。
이지 만 JDK 1.5 이후 에 야 enum 특성 을 넣 었 기 때문에 이런 방식 으로 쓰 는 것 은 생소 하고 실제 업무 에서 도 거의 사용 되 지 않 는 다.reflection attack 을 통 해 개인 구조 방법 을 사용 할 수 없습니다.public enum Singleton5 {
INSTANCE;
public void whateverMethod() {
}
}
: , , 。 lazy loading , 。 , 。 , 。
관련 된 역할
static
이 있 습 니 다.이 방법 은 항상 실례 를 되 돌려 준다.요점
구조 함수
구조 함 수 는 반드시 사유 가 되 어야 한다.
관련 디자인 모델
장점.
필드 사용
:getInstance() synchronized (Singleton.class) instance 。
코드
GitHub-Singleton 단일 모드
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.