单例模式:
懒汉式: 单例还是静态内部类式最优:
优点:利用了classloader机制来保证初始化instance时只有一个线程,线程安全且没有性能损耗
主类实例化之后,内部类才能开始实例化,所以调用的时候才会去创建对象;因为是static final和直接new的,所以不用考虑多线程的问题!
public class Singleton {
private Singleton() {}
//内部类的初始化需要依赖主类,需要先等主类实例化之后,内部类才能开始实例化
private static class LazyHolder {
//这里加final是为了防止内部将这个属性覆盖掉
private static final Singleton INSTANCE = new Singleton();
}
//这里加final是为了防止子类重写父类
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
懒汉式: 单例推荐使用懒汉式双重校验(既避免资源的浪费,又避免多线程的问题!)
synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
volatile保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
//缺点:双重锁降低了程序响应速度和性能
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
//进来发现不为空,直接返回,无需等待
if (singleton == null) {
//为空,排队执行
synchronized (Singleton.class) {
//后面进来判断是否已经创建对象,已经创建直接返回
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
饿汉式: 上来就new不用考虑多线程,缺点可能会造成资源的浪费!
public class Singleton {
private static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}