zoukankan      html  css  js  c++  java
  • 设计模式(1)>单例模式 小强斋

    单例设计

    一、单例设计

            Singleton类中永远只会有一个实例化对象,此种代码实现的根本原理就是在于将一个类的构造方法关闭了。

            当一个类中只能产生一个实例化对象的时候,就需要将构造方法封闭,封闭之后的操作通过一个静态方法取得本类的实例化对象。

        1. 构造方法私有化
        2. 本类的一个静态实例
        3. 提供一个静态方法获得本类的实例化对象

     如果要想继续划分的,实际上单例设计,还分成两种类型:

                      ·懒汉式:当第一次使用本类的对象时,在进行对象的实例化操作。

                      ·饿汉式:一个单例类中不管是否使用,都始终维护一个实例化对象。

    二、懒汉式

    class Singleton {
    
             private static Singleton instance =  null ;
    
             public static Singleton  getInstance(){       // 将instance传递到外部去
    
                       if(instance  == null){
    
                                instance  = new Singleton() ;
    
                       }
    
                       return  instance ;
    
             }
    
             private Singleton(){}
    
             public void print(){
    
                       System.out.println("Hello  World!!!") ;
    
             }
    
    };
    
    public class  Test{ 
    
             public static void main(String  args[]){
    
                       Singleton s1 =  Singleton.getInstance() ;
    
                       Singleton s2 =  Singleton.getInstance() ;
    
                       Singleton s3 =  Singleton.getInstance() ;
    
                       s1.print() ;
    
                       s2.print() ;
    
                       s3.print() ;
    
             }
    
    };
    

    三、饿汉式

    class Singleton {
    
             private static final Singleton instance = new  Singleton() ;   // 在内部准备好一个对象
    
             public static Singleton getInstance(){       // 将instance传递到外部去
    
                       return instance ;
    
             }
    
             private Singleton(){}
    
             public void print(){
    
                       System.out.println("Hello  World!!!") ;
    
             }
    
    };
    
    public class  Test{ 
    
             public static void main(String  args[]){
    
                       Singleton s1 =  Singleton.getInstance() ;
    
                       Singleton s2 =  Singleton.getInstance() ;
    
                       Singleton s3 =  Singleton.getInstance() ;
    
                       s1.print() ;
    
                       s2.print() ;
    
                       s3.print() ;
    
             }
    
    };
    

    四、单例模式的风险

    单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是private的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个B/S项目中,每个HTTP Request请求到J2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,假如现在有两个线程A和线程B,线程A执行到 instance  = new Singleton() ;正在申请内存分配,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到if(instance  == null) 你说这个时候这个判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个Singleton的实例了,看看是不是出问题了?
    如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?

    public class Singleton {
    	private static final Singleton singleton = new Singleton();
    
    	//限制住不能直接产生一个实例
    	private Singleton() {
    	}
    
    	public synchronized static Singleton getInstance() {
    		return singleton;
    	}
    }


    饿汉式+synchronized ?


     

  • 相关阅读:
    Ceph实验室:第六课:Ceph运维之横向扩展
    Ceph实验室:第五课:Ceph运维之换盘
    百度2014软件开发工程师笔试题详解 (转)
    阿里巴巴2014笔试题详解(9月22北京)(转)
    阿里巴巴2014秋季校园招聘-软件研发工程师笔试题详解(转)
    腾讯的2014年校招的软开笔试题(转)
    typedef与define区别
    java流总结(转)
    java 流 复制,重命名,删除目录
    java 流 读
  • 原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5637331.html
Copyright © 2011-2022 走看看