单例设计模式如其名,在系统中只存在一个实例,自行实例化供系统使用。(百度百科)每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。
饿汉式单例模式饿汉式就是利用关键字 static 的特性。在类加载初始化时,就创建好对象供外部使用,如果系统不重启的情况下,这个对象在系统中始终是唯一的。
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton(){}
public EagerSingleton getInstance() {
return this.instance;
}
}
总结
饿汉式的优点是线程安全,因为类只会被加载一次,在类加载时就创建了对象。缺点是无论是否使用,在类加载时都会创建对象,所以占用的内存空间比较大。
懒汉式单例模式懒汉式顾名思义,就是在需要的时候,再创建实例。
public class LazySingleTon {
private static LazySingleTon instance;
private LazySingleTon() {
}
public LazySingleTon getInstance() {
if (instance == null) {
this.instance = new LazySingleTon();
}
return instance;
}
}
总结
懒汉式的优点是在需要时对象才会被创建,不会再未使用时占用内存空间,缺点是在多线程的系统下还是可能会被创建多个对象。
双检锁懒汉式单例模式通过双重检查以及同步代码块创建的的饿汉式单例模式,保证在多线程系统中实例不会被多次创建
public class LazySyncSingleton {
private volatile static LazySyncSingleton instance;
private LazySyncSingleton(){};
public LazySyncSingleton getInstance() {
if (instance == null) {
synchronized (LazySyncSingleton.class) {
if (instance == null) {
instance = new LazySyncSingleton();
}
}
}
return instance;
}
}
总结
通过同步代码块以及双重检查保证多线程系统下实例的唯一性,但是需要注意重拍续的问题,所以在定义需要加上 volatile 关键字禁止重排序。



