ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 싱글톤 팁
    JAVA 2016.09.22 12:36

    디자인 패턴중 하나인 Singleton 패턴에 대해 사용하다가

    사람들마다 스타일이 있는걸 알았다 여러가지 스타일이 있겠지만 그중에서 두개를 골랐다.


    첫번째 스타일.

    public class One {
    private static One ourInstance = new One();

    public static One getInstance() {
    return ourInstance;
    }

    private One() {
    }
    }

    ourInstance 변수를 선언하고 바로 new One()을 생성하는 방법이 있고


    두번째 스타일.

    public class Two {
    private static Two ourInstance = null;

    public static Two getInstance() {
    if (ourInstance == null) {
    ourInstance = new Two();
    }
    return ourInstance;
    }

    private Two() {
    }
    }

    ourInstance 변수에 null을 주었다가 getInstance()를 호출하면 null체크후 새로운 객체를 만들어 사용하는 방법이 있다.


    후자의 방법은 스레드 등 환경에서 동시에 getInstance()를 호출하는 경우에 ourInstance 변수에 미처 객체가 생성되지

    않았는데 또 호출이 되어 두개의 객체를 생성하게 되는 경우가 생길 수 있어 안전하지 않게 된다.

    그러므로, 객체를 하나만 생성하여 관리하는것을 목적으로 하는 싱글톤 패턴과 맞지 않다.


    후자의 방법을 굳이 사용하고자 한다면 class 대신 enum으로 선언하여 사용하거나,

    아래와 같이 싱크로나이즈를 사용하여 동기를 시켜 한개의 객체만을 생성 할 수 있게 해주는것이 좋다.

    public static Two getInstance() {
    if (ourInstance == null) {
    synchronized(Two.class)
    {
    if(ourInstance == null)
    ourInstance = new Two();
    }
    }
    return ourInstance;
    }


    귀찮으니까 첫번째 스타일의 방법을 사용하자.



    'JAVA' 카테고리의 다른 글

    [Design Pattern] 싱글톤 팁  (3) 2016.09.22

    TAG

    댓글 3

    • 남나매 2016.09.22 14:02

      첫 번째 방법의 경우에는 One.getInstance(); 가 여러 쓰레드에서 동시에 실행되더라도 객체가 하나만 생성되는것인가요? 최초 호출 시 static의 new가 호출되는 것은 동일할 것 같은데요

      • Diordna 2016.09.22 14:05 신고

        동시에 호출된다고 가정을 하면 첫번째 방법은 static으로 이미 객체까지 생성되어있으니까 One.getInstance(); 에선 이미 static으로 생성되어있는 객체를 return해 주겠지요!
        두번째 방법에서 Two.getInstance();를 동시간에 호출한다면 둘다 null로 선언이 되있어서 if문을 통과할 가능성이 있습니닷

    • 남나매 2016.09.22 14:10

      private static One ourInstance의 경우 객체가 최초 호출될 경우 new One();이 되지않나요? 동시에 호출이 된다면 같은 상황이 생길 수 있을 것 같습니다.
      만약 프로그램 최초 실행 시 생성이 된다면 static 클래스를 만드는것과 차이가 없으니 싱글턴을 쓰는 이유가 없을 것 같구요

Designed by Tistory.