2.设计模式--单例模式

一、.单例模式

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管理,因此是单例的

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容