设计模式--单例模式

news/2024/12/23 1:22:44/

单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式经常用于系统中只需要一个实例的对象,例如日志管理器、数据库连接池、线程池等。
下面是几种常见的单例模式实现方式:

  1. 懒汉式(线程不安全)
    这是最简单的实现方式,但是它不是线程安全的。如果多个线程同时访问 getInstance 方法,可能会创建多个实例。
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  1. 懒汉式(线程安全)
    为了保证线程安全,可以在 getInstance 方法上加 synchronized 关键字,但这样会导致性能下降。
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  1. 双重检查锁定(DCL)
    双重检查锁定是懒汉式的优化版本,它既保证了线程安全又提高了效率。
public class Singleton {private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
  1. 饿汉式
    这种方式在类加载时就完成了初始化,避免了线程同步问题,但可能会导致在类加载时初始化实例造成资源浪费。
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
  1. 静态内部类
    这种方式利用了 Java 类加载机制保证初始化实例时只有一个线程,既实现了线程安全,又实现了延迟加载。
public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

每种实现方式都有其优缺点,在选择时可以根据实际需求进行考虑。例如,如果你的应用程序是多线程环境并且希望实例在第一次使用时创建,那么可以采用双重检查锁定的方式;如果你的应用程序是单线程环境,那么简单的懒汉式实现就足够了。


http://www.ppmy.cn/news/1512163.html

相关文章

Windows下添加开机启动项

三种方式 使用任务管理器:右键点击任务栏,选择“任务管理器”。切换到“启动”选项卡。点击右下角的“打开任务管理器”。在这里,你可以看到已启用和禁用的启动项。右键点击你希望添加的程序,选择“启用” 按Win R,输…

面试官问到Mysql索引时应该怎么回答?

1.什么是索引? 索引是帮助mysql高效获取数据的数据结构。 可以得到索引的本质:索引是数据结构 (可以简单理解为“排好序的快速查找数据结构”) 2.索引的目的? 索引的目的在于提高查询效率,可以类比字典 3.索引的优势和劣势&…

日拱一卒(8)——leetcode学习记录:位1的个数

一、任务: 编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 二、思路: 设置位就是值为1的位,因此需要将十进制转换为二进制,方法是余…

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是: 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈! →点击获取网络安全资料攻略← 一、自学…

[高频sql50ti]第1484题,按日期分组销售产品

题目: 表 Activities: ---------------------- | 列名 | 类型 | ---------------------- | sell_date | date | | product | varchar | ---------------------- 该表没有主键(具有唯一值的列)。它可能包含重复项。 此表的每一行都…

解决k8s分布式集群,子节点加入到主节点失败的问题

1.问题情况 Master主节点在 使用 kubeadm init 成功进行初始化后,如下所示 Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/k…

k8s高版本(1,28)部署NodePort模式下的ingress-nginx的详细过程及应用案例

文章目录 前言环境ingress安装应用案例(ingress-http案例: 基于名称的负载均衡) 前言 这个是nodeport模式下的,如果需要loadbalancer模式下的,看看博主下面以前的博客 链接: k8s学习–负载均衡器matelLB的详细解释与安装 链接: k8s学习–ing…

《AI视频类工具之十六——​ Apple Motion》

一.简介 官网:www.apple.com.cn Apple Motion,是一个创新的A(原生3D创作平台,利用人工智能技术来简化和加速3D动画的制作过程。该平台提供了多种A!工具和服务,使得用户能够以简单高效的方式创作和编辑3D动画内容。Apple Motion旨在打造一个涵盖3D、视频、动画、游戏等的人…