当前位置: 首页 > article >正文

设计模式-创建型-单例模式

1.概念

该设计模式保证全局只有一个实例对象可以使用,并且自动实例化,向外部提供一个使用接口。

2.作用

保证某些对象在项目中只有一份。

3.应用场景

比如:
全局的计数器——web页面文章阅读计数
全局的资源共享——用户登录后各个页面之间共享用户信息
线程池、数据库连接池——线程和连接可以多个,池应该只有一个

4.特点

单例对象全局只有一份

5.类与对象关系

使用static修饰该单例对象,保证全局可访问

6.实现

单例模式有多种实现方式,根据其创建时机的不同,可以分为饿汉式与懒汉式

6.1饿汉式

饿汉式会在类加载时就完成对象的创建

public class EagerSingleton {

  private static final EagerSingleton instance = new EagerSingleton();

  private EagerSingleton() {
    // 私有化构造函数
  }

  public static EagerSingleton getInstance() {
    return instance;
  }
}

6.2懒汉式

在真正要获取对象时才会创建对象,因为是调用方法时才创建对象,所以存在线程安全问题。

public class LazySingleton {

  private static LazySingleton instance;

  private LazySingleton() {
    // 私有化构造函数
  }

  public static LazySingleton getInstance() {
    if (instance == null) {
      instance = new LazySingleton();
    }
    return instance;
  }
}

6.3双重检查锁

为了保证懒汉式的线程安全,我们可以在方法上添加同步锁.

public class DoubleCheckedLockingSingleton {  
    private static volatile DoubleCheckedLockingSingleton instance;  
  
    private DoubleCheckedLockingSingleton() {  
        // 私有化构造函数  
    }  
  
    public synchronized static DoubleCheckedLockingSingleton getInstance() {  
        if (instance == null) {  
             instance = new DoubleCheckedLockingSingleton();  
            }  
        }  
        return instance;  
    }  
}

为了进一步缩小锁的粒度,提升效率,我们可以修改成以下形式,也叫双重检查锁

public class DoubleCheckedLockingSingleton {  
    private static volatile DoubleCheckedLockingSingleton instance;  
  
    private DoubleCheckedLockingSingleton() {  
        // 私有化构造函数  
    }  
  
    public static DoubleCheckedLockingSingleton getInstance() {  
        if (instance == null) {  
            synchronized (DoubleCheckedLockingSingleton.class) {  
                if (instance == null) {  
                    instance = new DoubleCheckedLockingSingleton();  
                }  
            }  
        }  
        return instance;  
    }  
}

http://www.kler.cn/a/406895.html

相关文章:

  • 学习ASP.NET Core的身份认证(基于Cookie的身份认证2)
  • javascrip页面交互
  • 如何复制只读模式下的腾讯文档
  • autoware(2)运行自己的数据集
  • CSP/信奥赛C++语法基础刷题训练(22):洛谷P1075:[NOIP2012 普及组] 质因数分解
  • 飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
  • ssm面向品牌会员的在线商城小程序
  • 【SQL Server】华中农业大学空间数据库实验报告 实验四 完整性约束
  • IDEA2024 maven构建跳过测试
  • 【跳线帽】是什么?怎么用?
  • AIVA 技术浅析(五):使用的自然语言处理(NLP)技术浅析
  • mac homebrew国内镜像源安装
  • SpringBoot社团管理:数据驱动的解决方案
  • uniapp、js判断输入的内容是整数
  • 动态规划子数组系列一>最长湍流子数组
  • 旋转向量v和旋转矩阵R
  • 抓包 127.0.0.1 (loopback) 使用 tcpdump+wireshark
  • java计算机毕设课设—企业采购信息管理系统(附源码、文章、相关截图、部署视频)
  • netstat -tuln | grep 27017(显示所有监听状态的 TCP 和 UDP 端口,并且以数字形式显示地址和端口号)
  • R语言p值矫正整的方法
  • 全面解析 JMeter 后置处理器:概念、工作原理与应用场景
  • HCIA考试内容多吗?HCIA数通学什么?
  • go interface(接口)使用
  • HashMap底层原理
  • 24.11.23 Ajax
  • 天线相位缠绕