Twitter
- 얼마전부터 아이폰 메일에서 메일 본문이 보이지 않아요. 혹시 해결책 아는 분 없나요? 5 hrs ago
- 제주장애인인권포럼에서 8월 한달간 '웹접근성'에 대해 교육해줄 수 있는 분을 찾습니다. 교육 내용은 http://njpaiks.egloos.com 에 정리된 내용 정도면 되고, 장애인 대상으로 주 4회 강의, 강사비도 지급됩니다. 7 hrs ago
- Facebook like 버튼에 comment도 넣을 수 있다. view 추천평은 성공하지 못했는데 Facebook은 어떨지... 아이덴티티가 강한 자신만의 홈페이지가 있으니 다르게 발전하겠지. 소셜 Q&A도 기대된다. 1 day ago
- More updates...
Posting tweet...
Powered by Twitter Tools
카테고리
- Java (14)
- Ruby & Languages (4)
- Software & Developer (58)
- 고양이 이야기 (8)
- 그들의 이야기 (13)
- 깨달음으로 가는 길 (49)
- 제주 생활 (11)
-
최근 작성글
-
최근 덧글
- 따지크 on NoSQL 정의와 사례 정리
- 에너 on NoSQL 정의와 사례 정리
- 성게군 on NoSQL 정의와 사례 정리
Java Singleton Pattern 구현
최근 singleton 패턴 구현에 대한 질문을 받은 적이 있다. singleton 패턴은 인스턴스를 하나만 생성해서 그 객체를 공유해서 사용하는 패턴이다. 일반적으로 DB Pool과 같이 전체 시스템에서 하나의 자원을 공유해서 사용할 때 이 패턴을 활용할 수 있다.
이 패턴을 구현하는 방법은 synchronized getInstance(), double-checked getInstance(), static final instance 등 다양한데, 내 경우는 Singleton 클래스를 구현하기 위해 static initializer를 활용한 방법을 제안했다.
public class Singleton { private static Singleton _instance; static { _instance = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return _instance; } }이렇게 구현한 경우 클래스가 로딩되면서 객체가 생성되기 때문에 객체가 이중으로 생성될 수 없고, 가장 확실한 방법인 synchronized getInstance()에 비해서 매번 메소드 호출시에 동기화 작업을 안해줘도 되는 장점이 있다. (synchronized 키워드가 있는 경우 메소드 실행이 약 100배 정도 늦어진다고 한다.)
하지만 오늘 관련 정보를 찾아보니, 글 작성자는 명백히 이 방법보다는 synchronized getInstance()가 좋다고 한다.
getInstance()에서 객체를 생성할 때 장점은 lazy initialization(객체가 사용될 때까지 객체 생성을 연기)이 가능하다는 점과 내부 구현을 Pooling 등으로 변경할 때 쉽게 변경이 가능하다는 것이다. (이 부분은 static initializer도 가능하다.)
다만 Singleton 패턴을 사용해도 ClassLoader 마다 개별적으로 인스턴스가 생성되기 때문에 이 부분은 주의를 기울여야 한다. 특히 Servlet Container는 여러개의 ClassLoader를 사용할 수 있으니 이 점을 인지하고 있어야 한다.