싱글톤 패턴
2014. 11. 10. 01:51ㆍBasic/etc
반응형
싱글톤은 하나의 인스턴스만 생성되는 클래스이다. 생성자의 접근자를 private으로 정의하고, 인스턴스를 리턴하는 public static 팩토리 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스 생성을 가능하도록 한다. getInstance()내부에서 하나의 인스턴스만 생성되도록 구현한다. 생성자가 private을 정의 되기때문에 서브클래스를 가질 수 없다.
-
public class User {
-
private static User user;
-
private User(){}
-
public static User getInstance(){
-
if(user == null){
-
user = new User();
-
}
-
return user;
-
}
-
}
Multi Thread 환경인 경우에는 다음과 같이 수정이 필요하다.
-
public class User {
-
private static User user = new User();
-
private User(){}
-
public static User getInstance(){
-
return user;
-
}
-
}
이 방법은 객체의 사용과 상관없이 인스턴스가 생성되므로 메모리의 낭비를 가져온다.
-
public class User {
-
private static User user;
-
private User(){}
-
public static synchronized User getInstance(){
-
if(user == null){
-
user = new User();
-
}
-
return user;
-
}
-
}
이방법은 synchronized가 첫 인스턴스가 만들어질때 한번만 실행되면 되는데, 매번 실행됨으로 성능의 저하를 가져온다.
다음과 같이 수정
※volatile은 하나의 변수를 여러 쓰레드에서 함께 사용하는 키워드다. 쓰레드가 volatile변수에 접근하면 이 변수는 자주 변하는 변수이니 원본 변수가 맞는지 다시 한번 확인하게하는 안전장치 키워드 정도로 이해하자.
-
public class User {
-
private volatile static User user;
-
private User(){}
-
public static User getInstance(){
-
if(user == null){
-
synchronized( User.class ) {
-
if ( user == null ) {
-
user = new User();
-
}
-
}
-
}
-
return user;
-
}
-
}
반응형
'Basic > etc' 카테고리의 다른 글
final, static (0) | 2014.11.10 |
---|---|
객체의 생성, 생성자 (0) | 2014.11.10 |
extends 와 implements의 차이? (0) | 2014.11.09 |
추상클래스와 인터페이스 (0) | 2014.11.09 |
접근제어자와 캡슐화 (0) | 2014.11.09 |