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中“select ... for update”排他锁分析
    PHP之十六个魔术方法详解
    常见分布式缓存问题
    关于UIView的autoresizingMask属性的研究【转】
    WWDC2014之iOS使用动态库 framework【转】
    Android.mk的用法和基础【转】
    iOS 利用 framework 进行动态更新
    cocos2d-x + Lua接入iOS原生SDK的实现方案[转]
    lua绑定c++的时候常见得错误
  • 原文地址:https://www.cnblogs.com/sophie_wang/p/1601936.html
Copyright © 2011-2022 走看看