1:简介
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
2:单例模式的特点
2.1、单例类只能有一个实例。
2.2、单例类必须自己创建自己的唯一实例。
2.3、单例类必须给所有其他对象提供这一实例。
3:最简单的单例模式,也称之为饿汉式
public class Singleton {
public static Singleton mSington = new Singleton();
private Singleton() {
// TODO Auto-generated constructor stub
}
}
4:懒汉式 (线程不安全),为什么叫做懒汉式,主要静态实例一开始并没有初始化,而是使用的时候才开始进行初始化。同时,下面这种写法是不安全的。
public class Singleton {
public static Singleton mSington ;// = new Singleton();
public static Singleton getInstance(){
if (mSington == null) {
mSington = new Singleton();
}
return mSington;
}
private Singleton() {
// TODO Auto-generated constructor stub
}
}
5:这也是懒汉式,不过加了synchronized关键字,在多线程调用的时候是安全的,性能相对来说比较差。
public class Singleton {
public static Singleton mSington ;// = new Singleton();
public static synchronized Singleton getInstance(){
if (mSington == null) {
mSington = new Singleton();
}
return mSington;
}
private Singleton() {
// TODO Auto-generated constructor stub
}
}
6:变种饿汉式(使用静态代码块去初始化),这种也是线程不安全的。
public static Singleton mSington ;// = new Singleton();
static{
mSington = new Singleton();
}
7:DCL单例(double check),这是单例99%的情况下都是线程安全的,不过在高并发下,也会导致异常。具体需要去分析字节码加载进jvm的情况、
public class Singleton {
public static Singleton mSington ;// = new Singleton();
public static Singleton getInstance(){
if (mSington == null) {
synchronized (Singleton.class) {
if (mSington == null) {
mSington = new Singleton();
}
}
}
return mSington;
}
private Singleton() {
// TODO Auto-generated constructor stub
}
}
总而言之,到最后,单例模式无非就是在内存中只有一份实例。