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

  • 相关阅读:
    python并行编程学习之绪论
    flask学习之解决Internal Server Error问题的方式之一
    mysql ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)错误解决办法
    python之numpy矩阵库的使用(续)
    python常用序列list、tuples及矩阵库numpy的使用
    计算机网络学习之概述篇
    C++数据结构学习之顺序表
    python-networkx学习(1)
    Html&CSS学习笔记03---CSS介绍、CSS语法、CSS与HTML的结合、CSS选择器、CSS常用样式
    Html&CSS学习笔记02---HTML标签的介绍
  • 原文地址:https://www.cnblogs.com/sophie_wang/p/1601936.html
Copyright © 2011-2022 走看看