线程安全的两种单例模式
项目中单例模式应该是使用的比较多的一种设计模式,具体有很多种实现单例的方式,但是考虑到在并发的情况下,需要注意线程安全,这里给出两种比较常用的线程安全的单例实现。
1.静态内部类实现
/**
* Created by Easzz on 15/06/2017.
* 静态内部类实现单例模式
*/
public class Singleton3 {
private Singleton3(){}
public static class Holder{
static Singleton3 singleton3=new Singleton3();
}
public static Singleton3 getInstance(){
return Holder.singleton3;
}
}
2.双重检查锁实现
/**
* Created by Easzz on 2017/1/15.
*/
public class Singleton {
//饿汉式单例模式
private static Singleton uniqueInstance=null;
private Singleton(){ }
//双重检查锁
public static Singleton getSingleton(){
if (uniqueInstance==null){
//若两个线程同时进入if,第一个线程进入synchronized,创建对象,第二个线程阻塞,
//当第一个线程退出时,需要再次判断是否为null,否则第二个线程还是会创建对象。
synchronized (Singleton.class){
if (uniqueInstance==null){
uniqueInstance=new Singleton();
}
}
}
return uniqueInstance;
}
}
另外,在《Effective java》中写到,
单元素的枚举类型已经成为实现Singleton的最佳方法。
用枚举也可以实现线程安全的单例模式。这里就不列出代码了。