zoukankan      html  css  js  c++  java
  • [转]Singleton 模式

    有这样一种类,它在整个系统中只存在一个实例.[中国这个类,地球这个类]

    而保证这个类只有一个实例,是类设计者的责任,而不是类的使用者.

    保证只有一个实例:

    private constructor.

    ** 不要实现Cloneable和Serializable接口.

    提供一个全局的访问点:

    public static access method.

    多线程安全?

    如果Class的实例化的开销不大,可以在类加载的时候就实例化一次,且仅仅一次)

         1.Eager
      public class EagerInitialization {
         private static Resource resource = new Resource();
         public static Resource getResource() {
         return resource;
        }
         static class Resource {}
      }
      2.Lazy
      public class SafeLazyInitialization {
           private static Resource resource;
           public synchronized static Resource getInstance() {
              if (resource == null){
                    resource = new Resource();

                   }
             return resource;
          }
          static class Resource {}
      }
      3.double checked locking singleton ( 仅适用于java 5.0 以上版本)
      public class DoubleCheckedLockingSingleton {
              //java5.0 修改了内存模型, 可以保证使用volatile 声明的变量对于double checked locking是正确的
              private volatile static DoubleCheckedLockingSingleton uniqueInstance;
              private DoubleCheckedLockingSingleton() {}
              public static DoubleCheckedLockingSingleton getInstance() {
                        if (uniqueInstance == null) {
                              synchronized (DoubleCheckedLockingSingleton.class) {
                                         if (uniqueInstance == null) {

                                                       // temp = new DoubleCheckedLockingSingleton();
                                                       // uniqueInstance = temp; [通过这样会更安全,JVM的原子性保证]
                                                  uniqueInstance = new DoubleCheckedLockingSingleton();
                                           }
                               }
                         }
                         return uniqueInstance;
                }
      }
      4.Lazy initialization holder class idiom
      public class ResourceFactory {
                    //增加一个helper类来初始化对象
                     private static class ResourceHolder {
                                public static Resource resource = new Resource();
                      }
                     public static Resource getResource() {
                                return ResourceFactory.ResourceHolder.resource;
                     }
                     static class Resource {}
      }

          根据Classloader的原则,一个类在其信息被需要用到的时候才被JVM加载,resource只有在调用getResource的时候才初始化.

           Singleton 的扩展:

           Singleton 的核心是如何控制用户使用new对一个类的实例化.

            N个实例-->对象池.

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kkdelta/archive/2009/02/28/3945472.aspx

  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/sophie_wang/p/1601936.html
Copyright © 2011-2022 走看看