일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Spring Framework
- Mockito #Reflection #Sigleton #Test #JUnit
- autocomplete
- LiveTemplate
- 외장톰캣
- 톰캣
- 디자인패턴 #싱글톤
- tomcat
- spring
- Today
- Total
자라선
Singleton Pattern 본문
Pattern Singleton
싱글톤. 디자인패턴의 한 부류이며
말 그대로 한번의 호출로 메모리에 적재하여 단 하나의 인스턴스만 사용하는 디자인패턴이다.
이번 스터디에서 싱글톤을 사용하여 코어프레임워크를 개발하게 되다보니
싱글톤에 대한 지식이 필요했다.
1. 싱글톤을 사용하는 이유는?
한번의 인스턴스 생성으로 스택 메모리에 적재되어 모든 객체로 공유할수 있고,
그에 따른 메모리를 효율적으로 다를수 있다.
허나 모든 객체로 공유됨에 있어 반대로 동시에 서로 다른 스레드가 같은 싱글톤에 접근 시
thread-safe의 이슈대상이 될수 있다.
싱글톤은 대표적으로 DB Connection 객체에 많이 사용된다.
2. SingleTon Design Pattern Code
1. 가장 일반적이지만 동기화 이슈를 해결하지 못한 싱글톤 패턴.
이미 static으로 선언돼 스택메모리에 인스턴스를 올린다.
그리곤 객체 호출시 getInstence() 메소드를 사용하여 return 시킨다.
package test;
public class SingleTon {
private static SingleTon singleton = new SingleTon();
private SingleTon() {}
public static SingleTon getIntence(){
return singleton;
}
}
package test;
public class main {
public static void main(String[] args) {
SingleTon single = SingleTon.getIntence();
SingleTon single2 = SingleTon.getIntence();
System.out.println("1. " + single.hashCode());
System.out.println("2. " + single2.hashCode());
}
}
2. JVM 로드시 인스턴스 생성 방지
1번 싱글톤은 jvm 로드시 바로 인스턴스를 스택메모리에 적재시키기 때문에
2번은 해당 객체를 실행하기전까지 의미없이 메모리를 낭비하는 것을 방지 해준다.
if 조건절을 사용하여 최초의 한번 getInstnce()를 실행시 인스턴스를 적재해준다.
package test;
public class SingleTon {
private static SingleTon singleton;
private SingleTon() {}
public static SingleTon getIntence(){
if(singleton == null){
singleton = new SingleTon();
}
return singleton;
}
}
3. synchronized 를 사용하여 공유 싱글톤의 thread-safe 이슈를 방지
하지만 synchronized로 인하여 성능저하로 잘 사용되지는 않는다.
package test;
public class SingleTon {
private static SingleTon singleton;
public SingleTon() {}
synchronized public static SingleTon getIntence(){
if(singleton == null){
singleton = new SingleTon();
}
return singleton;
}
}
4. JVM의 Class Loader 를 활용한 최적의 싱글톤
Inner Class를 스태틱으로 정의하여 클래스 자체를 메모리에 올림과 동시에
SingleTon 객체에서만 접근이 가능하며, SingleTonHolder의 전역 변수인 instence를
final로 정의함으로써 변경하지 못하도록 Class Loader를 응용한 일종의 꼼수 라고한다..(신기함;)
package test;
public class SingleTon {
public SingleTon() {}
private static class SingleTonHolder{
private static final SingleTon instence = new SingleTon();
}
public static SingleTon getIntence(){
return SingleTonHolder.instence;
}
}
Reference https://www.geeksforgeeks.org/java-singleton-design-pattern-practices-examples/
'Develop > Java' 카테고리의 다른 글
Heap 과 Stack 메모리 (0) | 2020.07.27 |
---|