간편한 Java 단일 예제 모드
특징: 구조기 사유화, 대상 사유화, 대외 방문 인터페이스 하나만 제공.
장면 적용:
1. 시스템은 자원을 공유해야 한다. 예를 들어 로그 시스템,spring의 자원 관리자 등이다.
2. 자원의 사용을 통제하기 위해: 예를 들어 스레드 탱크
엔터프라이즈급 개발 및 공통 프레임워크의 공통 응용 프로그램:
J2EE의 servlet, Spring의 자원 관리자(즉 beans), 데이터베이스 연결 탱크, 스레드 탱크, 로그 시스템, 사이트 계수기 등
단일 모드 분류:
1. 굶주린 모드: 굶주린 모드는 코드의 가장 간단한 단례 모드이지만 실례는 클래스가 초기화될 때 불러옵니다. 즉시 사용하지 않는 상황에서 시스템의 불러오는 속도를 느리게 합니다. 구체적인 코드는 다음과 같습니다.
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
2. 게으름뱅이 모델: 게으름뱅이 모델은 굶주린 모델에 비해 실례화된 유일한 대외 인터페이스에 놓고 처리하여 로드 지연을 실현하고 시스템 초기화 시간을 절약했지만 라인이 안전하지 않은 상황이 존재한다.
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
return new Singleton();
}
return instance;
}
}
3. 이중 검사 자물쇠: 이중 검사 자물쇠 모드는 사실 게으른 모드의 업그레이드로 게으른 모드를 안전하게 한다.주의: 이중 검사 자물쇠에 메모리 문제가 존재하여 이중 검사 자물쇠가 효력을 상실할 수 있습니다.
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
return new Singleton();
}
}
}
return instance;
}
}
4. 정적 내부 클래스 모델: 정적 내부 클래스는 게으름뱅이 모델과 악한 모델을 겸비하고 있다.
public class Singleton{
private static class SingletonFactory{
private static Singleton INSTANCE = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonFactory.INSTANCE;
}
}
5. 매거류 모델: 가장 완벽한 단리 모델이어야 한다. 라인이 안전할 뿐만 아니라 반서열과 반사 문제를 방지할 수 있다.
enum Singleton{
INSTANCE;
public void doSomething(){
...
}
}
단일 예제 모드 세부화 문제:1. 반사 타파 단일 모드: 반사를 통해 단일 모드의 실현을 파괴할 수 있다(매거진 모드 제외)
/**
*
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
Class<Singleton> clazz = (Class<Singleton>) Class.forName("com.singleton.Singleton");
Constructor<Singleton> constructor = clazz.getDeclaredConstructor(null);
constructor.setAccessible(true);
Singleton s3 = constructor.newInstance();
System.out.println(s1 == s3);
}
}
class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){
// ,
// if(instance != null){
// throw new RuntimeException();
// }
}
public static Singleton getInstance(){
return instance;
}
}
사실 방지란 반사를 통해 만들 수 없게 하는 것이다.2. 반서열화 타파 단일 모드(매거류 모드 제외)
/**
*
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
FileOutputStream fos = new FileOutputStream("d://test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s1);
oos.close();
fos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://test.txt"));
Singleton s3 = (Singleton) ois.readObject();
System.out.println(s1 == s3);
}
}
class Singleton implements Serializable{
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
// , ,
// private Object readResolve() throws ObjectStreamException{
// return instance;
//
// }
}
이 두 가지 상황은 이해에만 한정되어 실제 개발 과정에서 많이 사용되지 않는다.이로써 단일 모드는 완전하다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.