单件模式-《Head First 设计模式》第五章

来源:互联网 发布:域名后缀排名 编辑:程序博客网 时间:2024/06/04 01:10

Singleton Pattern(单件模式)

只有一个类的模式

一、定义

确保一个类只有一个实例,并提供一个全局访问点。

二、有什么用?

适用于对象只要一个的情况,比如:线程池thread pool,cache,对话框,处理偏好设置,register(注册表)对象,日志对象,充当打印机、显卡等设备的驱动程序的对象。

三、优点

单件模式提供一个全局访问点,和全局变量一样方便,却没有全局变量的缺点:需要一开始创建,假如其很消耗资源,却一直用不到,就会造成性能损耗。

四、多线程

单纯的单件模式在多线程的时候,可能会出现多次实例化的问题。因此有三种方法解决多线程问题。

1、单纯同步

适合性能要求不高的地方。

/** * 单纯同步:不考虑性能 * */public class SingletonSyn {    private static SingletonSyn uniqueInstance;    public static synchronized SingletonSyn getInstance() {        if(uniqueInstance == null) {            uniqueInstance = new SingletonSyn();        }        return uniqueInstance;    }     }

2、立即实例化

/** * 立即创建:非实例化延迟,能保证多线程同步问题。 *        JVM保证任何线程访问uniqueInstance静态变量前,一定会创建此实例。 * */public class SingletonImmediately {    private static SingletonImmediately uniqueInstance        = new SingletonImmediately();    public static synchronized SingletonImmediately getInstance() {        return uniqueInstance;    }     }

3、双重上锁

/** * 双重上锁同步(double-checked locking): 只有第一次会同步。 *     不适用于1.4以及更老版本java * */public class SingletonLockDouble {    //volatile确保多线程正确处理uniqueInstance变量    private static volatile SingletonLockDouble uniqueInstance;    public static synchronized SingletonLockDouble getInstance() {        //检查实例,不存在就进入同步块        if(uniqueInstance == null) {            //上锁            synchronized(SingletonLockDouble.class) {                //不存在则创建                if(uniqueInstance == null) {                    uniqueInstance = new SingletonLockDouble();                }            }        }        return uniqueInstance;    }     }
原创粉丝点击