单例模式
近期需要面试,把java设计模式重新回顾一遍,就从最简单的单例模式开始。陆续更新其他的设计模式。
废话少说,直接上代码,经典单例模式
/*饿汉式*/
public class Singleton(){
private static Singleton sin = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return sin;
}
}
/*懒汉式*/
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
上面这个懒汉式线程不安全,假设开始线程0进入,判断instance为空,在将要创建实例时,cpu切换,线程1又进来了,同样instance为空创建了实例,这是cpu切换回来到0线程,继续创建实例可见,经过分析共创建了两个实例,还谈什么单例。
改进
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
同步锁内外提供判断,保证安全的同时,提高效率。