一、.单例模式
1.三要素:
私有化构造器
类内创建对象
对外提供获取对象的public方法
2.饿汉式
类的初始化时,构建静态属性对象,或在静态块中创建对象,由于类的加载只有一次,所以饿汉式是天然线程安全的,但是由于初始化类就加载对象,可能会造成内存浪费。
3.懒汉式(方法加synchronized,线程安全)
getInstance()方法内创建对象,由于方法被同步,可以确保线程安全,可用,但是影响效率。
4.双重检查
配合volatile关键字,确保属性(对象)对多线程具有可见性。
懒汉式,getInstance()方法内加synchronized同步块,线程安全,双重检查确保效率。
public class SafeDoubleCheckedLocking {
private volatile static Instance instance;
private SafeDoubleCheckedLocking (){
}
public static Instance getInstance(){
if(instance ==null) {
synchronized (SafeDoubleCheckedLocking.class) {
if (instance == null)
instance = new Instance();
}
}
return instance;
}
}
5.静态内部类
说明:
主类加载时,静态内部类不加载--实现懒加载
调用getInstance方法时,静态内部类加载,类的加载是天然线程安全的--实现线程安全
public class Singleton {
private Singleton(){
//构造器私有化
}
private static class SingletonInstance{
//类的内部创建对象
private static final SingletonINSTANCE =new Singleton();
}
public static Singleton getInstance() {
//获取对象的public方法
return SingletonInstance.INSTANCE;
}
}
6.枚举
所有枚举对象都是单例的
7.实际应用举例:
1)springboot框架中,@Component+@Autowired注解,可以确保单例;
如果直接new对象(可以new),那就不单例了(new出来的对象不是spring管理的)
2)@Configuration+@Bean,对象也受spring管理,因此是单例的