饿汉模式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton () {
}
public Singleton getInstance(){
return instance;
}
}
优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化。如果从始至终从未使用过这个实例,则会造成内存的浪费。
懒汉模式
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点:延时加载
缺点:线程不安全
懒汉模式优化
public class Singleton {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
volatile关键字
上部分代码因为java指令重排优化导致线程并不安全,所以为了绝对线程安全可在变量前面添加volatile关键字禁止指令重排优化
1、可见性:可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。
2、原子性:原子操作线程安全
3、有序性:禁止指令重排序
优点:延时加载,线程安全
缺点:JDK 1.5之前 由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化,可能会导致系统运行效率降低
内部静态类
public class Singleton {
private Singleton() {
}
private static class SingleHelper {
private static final Singleton instance;
}
public static Singleton getInstance() {
return SingleHelper.instance;
}
}
优点:延时加载,线程安全,推荐使用
缺点:暂无
枚举
public enum Singleton {
INSTANCE;
}
优点:延时加载,线程安全,推荐使用
缺点:JDK 1.5之后才能使用。android中使用枚举会占用较多内存