Java 设计模式(1)单例模式
- 特点
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
- springboot中哪些是单例
- 核心注解定义的Bean
@Component、@Service、@Repository、@Controller注解标注的类,Spring容器默认创建单例实例
- 配置类中的
@Bean方法-
@Configuration public class AppConfig { @Bean public DataSource dataSource() { ... } // 单例 }
-
-
自动装配的依赖
-
@Autowired private UserRepository userRepo; // 注入单例
-
- 核心注解定义的Bean
- 分类
- 懒汉式单例
-
//懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { // 构造方法私有化 private Singleton() { } private static Singleton single = null; // 静态工厂方法 publicstatic
synchronizedSingleton getInstance() { if (single == null) { single = new Singleton(); } return single; } } - 注:
- 只能通过getInstance()获取单例。
- 用
synchronize关键字修饰,保证线程安全
-
- 懒汉式-双重检查锁定
-
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; } }
-
- 懒汉式-静态(类级)内部类
-
public class Singleton{ private Singleton() { } private static class SingletonHolder{ private static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
-
- 饿汉式单例
-
public class Singleton{ private static Singletoninstance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }
-
- 懒汉式单例
- 区别
- 加载时间
- 饿汉就是类一旦加载,就把单例初始化完成,在调用getInstance的时候,单例是已经存在的了
- 懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例
- 线程安全
- 饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题
- 懒汉式本身是非线程安全的,为了实现线程安全有几种写法
- 资源加载和性能
- 饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成
- 懒汉式会在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
- 什么是线程安全
- 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的
- 加载时间
- 下一篇
本文来自博客园,作者:zwjvzwj,转载请注明原文链接:https://www.cnblogs.com/zwjvzwj/p/18999154