Head First Design Pattern 读书笔记(4) Singleton Pattern 单例模式
###Silngleton Pattern 类图 单例模式非常简单,基本没有什么类之间的关系,就不画图了,保证某个类生成的实例只有一个即可。
###定义
- 单例模式:只允许一个类实例化一个对象,并提供一个可以全局访问这个实例的方法(接口)。
###关于单例模式
- 最简单的单例模式实现方法是:
/*
*“懒汉式”写法,即等要用了再去实例化实例对象,而不是应用一启动就实例化好放在容器中。
*/
public class Singleton {
private Singleton();
private static Singleton instance;
public static getSingleton(){
if(instance==null){
instance = new Sinleton();
}
return instance;
}
}
- 1中实现的singleton在多线程中可能会有多个线程同时实例化,导致实例对象不止一个的问题,解决方案是使用同步锁,或者使用“饿汉式”的写法。
//双重检查锁的写法,因为使用了volatile关键字,需要jdk1.4以上
public class Singleton {
private Singleton();
private static volatile Singleton instance;
public static getSingleton(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance = new Sinleton();
}
}
}
return instance;
}
}
/**
* “饿汉式”的写法,因为没用到同步锁,所以后期效率最高。
**/
public class Singleton {
private Singleton();
private static Singleton instance = new Singleton();
public static getSingleton(){
return instance;
}
}
其实所谓“懒汉式”与“饿汉式”的写法,只是区别在初始化的时机而已。“饿汉式”写法由jvm保证一应用启动时只实例化一个对象,由于多了一步实例化操作,应用启动会稍微慢点。而“懒汉式”由于是在应用启动后实例对象,所以要考虑多线程并发的情况。对于不是很大的应用,个人偏向于“饿汉式”,毕竟启动的时候多花点时间启动,换来后期运行的安全与效率也是值得的。谁没事天天重启生产上的程序啊(╯‵□′)╯︵┻━┻ 。
来源:oschina
链接:https://my.oschina.net/u/1010578/blog/379340