• Java单例模式实现方式


            单例模式是指在内存中 只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
    image.png

     

          
      单例模式有很多实现方法,饿汉、懒汉、静态内部类、枚举类;
            饿汉式:类加载就会导致该单实例对象被创建;
            懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建;
    1、饿汉式
    1. public class Singleton{
    2. //在类加载时已经创建好该对象,在程序调用时直接返回该单例对象
    3. private static final Singleton INSTANCE= new Singleton();
    4. private Singleton(){}
    5. public static Singleton getInstance() {
    6. return INSTANCE;
    7. }
    8. }

    2、懒汉式_Double Check(双重校验) + Lock(加锁)+ volatile(防止指令重排)
    1. public final class Singleton {
    2. private Singleton() { }
    3. private static volatile Singleton INSTANCE = null;
    4. public static Singleton getInstance() {
    5. if (INSTANCE != null) {
    6. return INSTANCE;
    7. }
    8. //每次去获取对象都需要先获取锁,并发性能非常地差,极端情况下,可能会出现卡顿现象
    9. //优化:如果没有实例化对象则加锁创建,如果已经实例化了,则不需要加锁,直接获取实例
    10. synchronized (Singleton.class) {
    11. if (INSTANCE != null) {
    12. return INSTANCE;
    13. }
    14. INSTANCE = new Singleton();
    15. return INSTANCE;
    16. }
    17. }
    18. }

    3、懒汉式_静态内部类(比较推荐)

    1. public final class Singleton {
    2. private Singleton() { }
    3. private static class LazyHolder {
    4. static final Singleton INSTANCE = new Singleton();
    5. }
    6. public static Singleton getInstance() {
    7. //用到时才会给LazyHolder.INSTANCE做初始化;
    8. return LazyHolder.INSTANCE;
    9. }
    10. }

    4、枚举创建

    优点:

            ①在程序启动时,会调用Singleton的空参构造器,实例化好一个Singleton对象赋给INSTANCE,之后再也不会实例化;;

            ②使用枚举可以防止调用者使用反射序列化与反序列化机制强制生成多个单例对象,破坏单例模式。

    1. public enum Singleton {
    2. INSTANCE;
    3. }

  • 相关阅读:
    MyBatisPlus知识点总结-DX的笔记
    Redis-使用java代码操作Redis
    js-二级菜单-统一处理动画效果
    iOS13 tabBar 设置背景色失效
    Capture One Pro 23:重新定义Raw图像处理的行业标准
    深度克隆和浅拷贝的区别
    Android学习笔记 79. 菜单和选择器
    【计算机网络实验】虚拟局域网VLAN配置实验
    细粒度图像分类论文研读-2014
    DSPE-PEG-OH,DSPE-PEG-Hydroxyl,磷脂-聚乙二醇-羟基仅供科研实验使用
  • 原文地址:https://blog.csdn.net/qq_42900213/article/details/126226651