一、单例模式的特点
1.只有一个实例
2.自己给自己创建实例
3.单例类负责给其他所有对象提供这个实例
二、单例模式的几种写法及其特点
1、懒汉式,无法保证线程安全
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
2、懒汉式,保证线程安全的方法
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
注意:此方法虽然保证了线程安全,但是执行的效率会很低。
3、DCL机制(双重检查锁机制),既保障了线程安全,又保障了执行效率
public class Singleton{
volatile private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
}
}
注意:偶尔脸黑会发生DCL失效,虽然概率很小,不建议在低于JDK6以下的版本使用,一般能够满足需求。
4、静态内部类的单例模式,保证线程安全和执行效率
public class Singleton{
private static class SingletonHolder{
private static Singelton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}'
注意:在第一次调用getInsance方法时才会使instance初始化,能够保证线程安全且保证效率。
网友评论