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

设计模式-单例模式(java)

单例是一种常用的设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点。在Java编程语言中,实现单例有多种方法,本篇文章将介绍其中的两种实现方式。

方式一:饿汉式单例模式

饿汉式单例模式是最简单的实现方式,它的原理是在类加载时就创建实例,并在全局访问点返回该实例。以下是实现饿汉式单例模式的代码:

public class Singleton {private static Singleton instance = new Singleton();private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {return instance;}
}

在这个实现中,私有化的构造函数防止了外部实例化该类,而静态的instance变量在类加载时就被创建,getInstance方法返回该静态变量。由于instance是静态的,所以它在整个应用程序的生命周期内只被创建一次,保证了单例的实现。

方式二:懒汉式单例模式

懒汉式单例模式是另一种常用的实现方式,它的原理是在需要时才创建实例,并在全局访问点返回该实例。以下是实现懒汉式单例模式的代码:

public class Singleton {private static Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

在这个实现中,静态的instance变量在第一次调用getInstance方法时才被创建,保证了懒加载的特性。需要注意的是,在多线程环境下,可能会有多个线程同时访问getInstance方法,导致实例被创建多次。为了解决这个问题,可以在getInstance方法上添加synchronized关键字,或使用双重检查锁定等线程安全的方式来实现懒汉式单例模式。多线程环境下调用单例可能会引发线程安全问题。下面通过代码示例演示如何在多线程环境下正确地调用单例。

首先,我们来看一个简单的单例实现:

public class Singleton {private static Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

在单线程环境下,这个实现是可以正常工作的。但在多线程环境下,会有多个线程同时访问getInstance方法,可能会导致实例被创建多次,违背了单例模式的原则。

为了解决这个问题,我们可以给getInstance方法添加synchronized关键字,这样只有一个线程能够访问getInstance方法,其他线程需要等待:

public class Singleton {private static Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这个实现是线程安全的,但是synchronized关键字会导致性能下降,因为每个线程都需要获取锁。为了提高性能,可以使用双重检查锁定的方式来实现单例:

public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

这个实现使用了volatile关键字来保证多个线程能够正确地处理instance变量。另外,双重检查锁定的方式可以避免多个线程同时获取锁的情况,提高了性能。

总结

单例是一种常用的设计模式,在Java编程语言中有多种实现方式。饿汉式单例模式是最简单的实现方式,它的实例在类加载时就被创建。懒汉式单例模式则是在需要时才创建实例,具有懒加载的特性。无论选择哪种实现方式,都需要注意线程安全问题,避免实例被创建多次可以使用synchronized关键字或双重检查锁定的方式来实现线程安全的单例。需要注意的是,双重检查锁定需要使用volatile关键字来保证线程安全。

http://www.lryc.cn/news/24060.html

相关文章:

  • Revit中复合墙图层的规则和CAD识别翻模墙
  • 【DL】Paddle BML Codelab环境使用说明 - 知识点目录
  • python正则表达式处理文本-re模块
  • 换了固态硬盘需要重装系统吗?教你如何实现不重装系统!
  • 网上医疗预约挂号系统
  • 专题:一看就会的C++类模板讲解 (1)
  • 什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化
  • 角谷定理(递归)
  • 数学小课堂:微积分复盘(高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。)
  • JAVA线程池原理详解一
  • Windows平台Unity Camera场景实现轻量级RTSP服务和RTMP推送
  • LSB 题解
  • 离线部署docker与镜像
  • Linux文件系统介绍(上)
  • 创建SpringBoot注意事项
  • 2023年全国最新二级建造师精选真题及答案9
  • 解决MySQL的 Row size too large (> 8126).
  • 最优传输问题和Sinkhorn
  • Netty核心组件EventLoop源码解析
  • 排障命令-汇总
  • python+pytest接口自动化(4)-requests发送get请求
  • 开源电子书工具Calibre 6.3 发布
  • C++ STL:适配器 Adapter
  • 防抖和节流
  • vue3 微信扫码登录及获取个人信息实现的三种方法
  • Java8 新特性强大的Stream API
  • day22_IO
  • 第三十八章 linux-并发解决方法二(信号量)
  • 数据结构-考研难点代码突破(C++实现树型查找 - B树插入与遍历,B+树基本概念)
  • Python可视化界面编程入门