设计模式-单例模式

来源:互联网 发布:mac svn服务器地址 编辑:程序博客网 时间:2024/05/01 17:16

单例模式的应用场景

有些时候我们程序只需要一个对象:线程池,缓存,打印机这种硬件设备
比如打印机,如果是多个对象,又对应一个硬件,各自设置打印内容,就会混淆。

单例模式 : 确保一个类只有一个实例,并提供全局访问点

一般Singleton模式通常有三种形式:

  1. 饿汉式
  2. 懒汉式
  3. 双重锁的形式

1.懒汉式
通俗来说就是你很懒,需要的时候才new对象

public class SingletonClass{    private static SingletonClass instance=null;    public static SingletonClass getInstance(){        if(instance==null){               instance=new SingletonClass();        }        return instance;    }    private SingletonClass(){        //把构造方法使用private修饰,则不能外部new对象    }}

2.饿汉式
通俗来说就是你饿了,不要的时候也new一个对象

public class Singleton{    //在自己内部定义自己的一个实例,只供内部调用    private static final Singleton instance = new Singleton();    private Singleton(){    }    public static Singleton getInstance(){        if(instance == null)            {                instance = new Singleton();            }        return instance;    }}

以上两种形式满足一般需求,懒汉式比较常用。但是在高并发的情况下就会出现问题,所以就引出了第三种
3.双重锁形式

public class Singleton{    private static volatile Singleton instance=null;    private Singleton(){        //do something    }    public static  Singleton getInstance(){        if(instance==null){            synchronized(Singleton.class){                if(instance==null){                    instance=new Singleton();                }            }        }        return instance;     }}//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时                 都进行同步,只有第一次才同步,创建了以后就没必要了。//这种模式中双重判断加同步的方式,比第一个例子中的效率大大提升,因为如果单层if判断,在服务器允许的情况下,//假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。//所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。
1 0
原创粉丝点击