Java 设计模式(1)单例模式

  1. 特点
    1. 单例类只能有一个实例。
    2. 单例类必须自己创建自己的唯一实例。
    3. 单例类必须给所有其他对象提供这一实例。
  2. springboot中哪些是单例
    1. 核心注解定义的Bean
      1. @Component@Service@Repository@Controller注解标注的类,Spring容器默认创建单例实例‌
    2. 配置类中的@Bean方法
      1. @Configuration
        public class AppConfig {
            @Bean
            public DataSource dataSource() { ... } // 单例
        }
    3. 自动装配的依赖

      1. @Autowired
        private UserRepository userRepo; // 注入单例

         

  3. 分类
    1. 懒汉式单例
      1. //懒汉式单例类.在第一次调用的时候实例化自己   
        public class Singleton {
            // 构造方法私有化
            private Singleton() {
            }
            private static Singleton single = null;
            // 静态工厂方法
            publicstatic synchronized  Singleton getInstance() {
                if (single == null) {
                    single = new Singleton();
                }
                return single;
            }
        }

         

      2. 注:
        1. 只能通过getInstance()获取单例。
        2. synchronize关键字修饰,保证线程安全 
    2. 懒汉式-双重检查锁定
      1. public class Singleton {
            private static volatile Singleton instance = null;
        
            private Singleton() {
            }
            public static Singleton getInstance() {
                if (instance == null) {
                    synchronized (Singleton.class) {
                        if (instance == null) {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }

         

    3. 懒汉式-静态(类级)内部类
      1. public class Singleton{
            private Singleton() {
            }
            private static class SingletonHolder{
                private static Singleton instance = new Singleton();
            }
            public static Singleton getInstance() {
                return SingletonHolder.instance;
            }
        }

         

    4. 饿汉式单例
      1. public class Singleton{
            private static Singletoninstance = new Singleton();
        
            private Singleton() {
            }
            public static Singleton getInstance() {
                return instance;
            }
        }

         

  4. 区别
    1. 加载时间
      1. 饿汉就是类一旦加载,就把单例初始化完成,在调用getInstance的时候,单例是已经存在的了
      2. 懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例
    2. 线程安全
      1. 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题
      2. 懒汉式本身是非线程安全的,为了实现线程安全有几种写法
    3. 资源加载和性能
      1. 饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成
      2. 懒汉式会在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
    4. 什么是线程安全
      1. 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的
  5. 下一篇
    1. Java 设计模式(2)工厂模式
posted @ 2025-07-24 14:32  zwjvzwj  阅读(16)  评论(0)    收藏  举报