单例模式
单例模式即整个进程中只存在一个实例对象,所有线程共用同一个实例对象
饿汉模式
所谓饿汉,即非常饥饿,一开始就需要食物,也就是说对象实例在编译过程中类加载时就创建实例。
public class Single {
private static Single instance = new Single();
private Single() {
}
public static Single getInstance() {
return instance;
}
}
懒汉模式
所谓懒汉,就是非常懒。你不让它干活就不干,叫它了它才干,也就是说对象实例在被使用到的时候才会被创建。
public class Single {
private static Single instance = null;
private Single() {
}
public static synchronized Single getInstance() {
if(null == instance){
instance = new Single();
}
return instance;
}
}
双重检查锁
双重检查锁,在懒汉模式下优化了锁的粒度。
public class Single {
private static Single instance = null;
private Single() {
}
public static synchronized Single getInstance() {
if(null == instance){
synchronized (Single.class){
if(null == instance){
instance = new Single();
}
}
}
return instance;
}
}
类内静态方法
先上代码
public class Single {
private Single() {}
public static Single getInstance(){
return SingleFactory.singleInstance;
}
private static class SingleFactory {
private static Single singleInstance = new Single();
}
}
线程安全单例模式最美观写法。
- 通过构造方法私有化,保证单例
- 通过静态类保证类加载时只会加载类静态变量,不会加载其中内部类从而生成对象实例,在其中getInstance方法被调用之后才会生成实例
- 通过jvm内部机制,对于类的构造方法中()会让其它线程阻塞,从而实现线程安全