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

  • 相关阅读:
    table的边框样式(小技巧)
    当人有更高目标追求的话,会发现周围的利益之争很可笑
    科普连载(原著:幽灵蝶)
    关于ASP.NET中的负载均衡
    验证控件与Button的OnClientClick事件(转)
    SQL Server 索引基础知识(2)聚集索引,非聚集索引(转)
    js中的Number和parseInt(小技巧)
    google的一些域名
    对多维宇宙的理解(时间、空间、超越光速,空间时间旅行)
    SNS
  • 原文地址:https://www.cnblogs.com/sophie_wang/p/1601936.html
Copyright © 2011-2022 走看看