Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
study:java:design_pattern:singleton [2008/08/14 13:44] bananastudy:java:design_pattern:singleton [2014/01/09 00:12] (現在) banana
行 17: 行 17:
 기법이 꽤 유용하죠. 기법이 꽤 유용하죠.
  
-===== implementation 1 =====+{{keywords>Singleton Pattern}} 
 + 
 +===== Implementation 1 =====
 고전적인 싱글턴 구현법을 소개합니다. 고전적인 싱글턴 구현법을 소개합니다.
 <code java> <code java>
-public class Singleton{+public class Singleton {
      private static Singleton uniqueInstance;      private static Singleton uniqueInstance;
  
-     private Singleton(){}+     private Singleton() {}
  
-     public static Singleton getInstance(){ +     public static Singleton getInstance() { 
-         if(uniqueInstance == null){+         if (uniqueInstance == null) {
               uniqueInstance = new Singleton();               uniqueInstance = new Singleton();
          }          }
行 42: 行 44:
  
  
-===== a issue of multi-thread problem =====+ 
 +===== Multi-thread problem =====
 getInstance()를 동기화시키기만 하면 멀티스레딩과 관련된 문제가 간단하게 해결됩니다.\\ getInstance()를 동기화시키기만 하면 멀티스레딩과 관련된 문제가 간단하게 해결됩니다.\\
 다음의 코드를 살펴보세요. 다음의 코드를 살펴보세요.
 <code java> <code java>
-public class Singleton{+public class Singleton {
      private static Singleton uniqueInstance;      private static Singleton uniqueInstance;
  
-     private Singleton(){}+     private Singleton() {}
  
-     public static synchronized Singleton getInstance(){ +     public static synchronized Singleton getInstance() { 
-         if(uniqueInstance == null){+         if (uniqueInstance == null) {
              uniqueInstance = new Singleton();              uniqueInstance = new Singleton();
          }          }
行 86: 行 89:
  
 <code java> <code java>
-public class Singleton{+public class Singleton {
      private static Singleton uniqueInstance = new Singleton();      private static Singleton uniqueInstance = new Singleton();
  
-     private Singleton(){}+     private Singleton() {}
  
-     public static Singleton getInstance(){+     public static Singleton getInstance() {
          return uniqueInstance;          return uniqueInstance;
      }      }
行 107: 行 110:
  
 <code java> <code java>
-public class Singleton{+public class Singleton {
     private volatile static Singleton uniqueInstance;     private volatile static Singleton uniqueInstance;
  
-    private Singleton(){}+    private Singleton() {}
  
-    public static Singleton getInstance(){ +    public static Singleton getInstance() { 
-        if(uniqueInstance==null){ +        if (uniqueInstance == null) { 
-            synchronized(Singleton.class){ +            synchronized(Singleton.class) { 
-                if(uniqueInstance==null){+                if (uniqueInstance == null) {
                      uniqueInstance = new Singleton();                      uniqueInstance = new Singleton();
                 }                 }
行 133: 行 136:
   - DCL을 사용하는 방법은 자바2 버전 5(자바 1.5)보다 전에 나온 버전에서는 쓸 수 없습니다.(volatile)   - DCL을 사용하는 방법은 자바2 버전 5(자바 1.5)보다 전에 나온 버전에서는 쓸 수 없습니다.(volatile)
   - 클래스 로더가 여러개 있으면 싱글턴이 제대로 작동하지 않고, 여러개의 인스턴스가 생길 수 있습니다.   - 클래스 로더가 여러개 있으면 싱글턴이 제대로 작동하지 않고, 여러개의 인스턴스가 생길 수 있습니다.
-  - 1.2버전보다 전에 나온 JVM을 사용하는 경우에는 가비지 컬렉터 관련 버그((자바 1.2가 나오기 전까지는 가비지 컬렉터의 버그 때문에 싱글턴에 대한 전역 레퍼런스가 없는 경우에 아직 다 쓰지도 않는 싱글이 가비지 컬렉터에 의해 제거되는 일이 있었습니다. 즉, 싱글턴을 만들 수는 있지만 그 싱글턴에 대한 유일한 레퍼런스가 싱글턴 자체에만 있는 경우에는 가비지 컬렉터에 의해 그 인스턴스가 제거될 수도 있었죠. 싱글턴이 제거되고 나면 getInstance()를 호출했을 때 갓 만들어진 새 싱글턴이 리턴되기 때문에 아주 골치아픈 버그가 생길 수 있었습니다. 조금 전까지 잘 쓰고 있었는데, 갑자기 상태가 초기값으로 리셋되거나 네트워크 연결이 리셋되는 것 같은 이상한 일들이 벌어지곤 했습니다. \\ 하지만 자바 1.2부터는 이 버그가 수정돼서 전역 레퍼런스가 없어도 가비지 컬렉터에 의해 제거되는 일은 생기지 않습니다. 피치 못할 사정이 있어서 자바 1.2가 나오기 전에 나왔던 JVM을 사용해야 한다면 이 문제를 잘 기억해 두는 것이 좋습니다. 하지만 1.2 이후 버전을 사용한다면 괜히 가비지 컬렉터가 싱글턴을 잡아먹지는 않을까 하는 걱정을 할 필요가  없습니다.))때문에 싱글턴 레지스트리를 사용해야 할 수도 있습니다.+  - 1.2버전보다 전에 나온 JVM을 사용하는 경우에는 가비지 컬렉터 관련 버그((자바 1.2가 나오기 전까지는 가비지 컬렉터의 버그 때문에 싱글턴에 대한 전역 레퍼런스가 없는 경우에 아직 다 쓰지도 않는 싱글이 가비지 컬렉터에 의해 제거되는 일이 있었습니다. 즉, 싱글턴을 만들 수는 있지만 그 싱글턴에 대한 유일한 레퍼런스가 싱글턴 자체에만 있는 경우에는 가비지 컬렉터에 의해 그 인스턴스가 제거될 수도 있었죠. 싱글턴이 제거되고 나면 getInstance()를 호출했을 때 갓 만들어진 새 싱글턴이 리턴되기 때문에 아주 골치아픈 버그가 생길 수 있었습니다. 조금 전까지 잘 쓰고 있었는데, 갑자기 상태가 초기값으로 리셋되거나 네트워크 연결이 리셋되는 것 같은 이상한 일들이 벌어지곤 했습니다. \\ 하지만 자바 1.2부터는 이 버그가 수정돼서 전역 레퍼런스가 없어도 가비지 컬렉터에 의해 제거되는 일은 생기지 않습니다. 피치 못할 사정이 있어서 자바 1.2가 나오기 전에 나왔던 JVM을 사용해야 한다면 이 문제를 잘 기억해 두는 것이 좋습니다. 하지만 1.2 이후 버전을 사용한다면 괜히 가비지 컬렉터가 싱글턴을 잡아먹지는 않을까 하는 걱정을 할 필요가  없습니다.))때문에 싱글턴 레지스트리를 사용해야 할 수도 있습니다.
  
  
  

QR Code
QR Code study:java:design_pattern:singleton (generated for current page)