单例模式
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。
类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。静态内部类(线程安全,调用效率高,可以延时加载)
public class Singleton {
private Singleton(){}
private static class SingletonInstance{
private static final Singleton instance=new Singleton();
}
public static Singleton getInsance(){
return SingletonInstance.instance;
}
}
饿汉型(线程安全,调用效率高,但是不能延时加载)
优点:简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,造成内存的浪费。
public class Singleton{
private Singleton(){}
private static final Singleton instance = new Singleton;
public static Singleton getInstance(){
return instance;
}
}
懒汉型(线程安全,同步方法)
public class SingletonDemo2 {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo2 instance;
//构造器私有化
private SingletonDemo2(){}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance=new SingletonDemo2();
}
return instance;
}
}