싱글톤 패턴

2014. 11. 10. 01:51Basic/etc

반응형
싱글톤은 하나의 인스턴스만 생성되는 클래스이다. 생성자의 접근자를 private으로 정의하고, 인스턴스를 리턴하는 public static 팩토리 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스 생성을 가능하도록 한다.  getInstance()내부에서 하나의 인스턴스만 생성되도록 구현한다. 생성자가 private을 정의 되기때문에 서브클래스를 가질 수 없다.

  1. public class User {
  2.     private static User user;
  3.     private User(){}
  4.     public static User getInstance(){
  5.         if(user == null){
  6.             user = new User();
  7.         }
  8.         return user;
  9.     }
  10. }
Multi Thread 환경인 경우에는 다음과 같이 수정이 필요하다.

  1. public class User {
  2.     private static User user = new User();
  3.     private User(){}
  4.     public static User getInstance(){
  5.         return user;
  6.     }
  7. }
이 방법은 객체의 사용과 상관없이 인스턴스가 생성되므로 메모리의 낭비를 가져온다.

  1. public class User {
  2.     private static User user;
  3.     private User(){}
  4.     public static synchronized User getInstance(){
  5.         if(user == null){
  6.             user = new User();
  7.         }
  8.         return user;
  9.     }
  10. }
이방법은 synchronized가 첫 인스턴스가 만들어질때 한번만 실행되면 되는데, 매번 실행됨으로 성능의 저하를 가져온다.
다음과 같이 수정
volatile은 하나의 변수를 여러 쓰레드에서 함께 사용하는 키워드다. 쓰레드가 volatile변수에 접근하면 이 변수는 자주 변하는 변수이니 원본 변수가 맞는지 다시 한번 확인하게하는 안전장치 키워드 정도로 이해하자. 

  1. public class User {
  2.     private volatile static User user;
  3.     private User(){}
  4.     public static User getInstance(){
  5.         if(user == null){
  6.             synchronized( User.class ) {
  7.                 if ( user == null ) {
  8.                     user = new User();
  9.                 }
  10.             }
  11.         }
  12.         return user;
  13.     }
반응형

'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