Java中单例模式的线程安全性

news/2024/11/17 0:07:44/

Java中单例模式的线程安全性

在Java中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。然而,当多个线程同时访问单例对象时,可能会引发线程安全性的问题。

以下是几种常见的实现单例模式的方式,以及它们的线程安全性:

饿汉式(Eager Initialization):

在类加载时就创建单例实例,并在需要时直接返回该实例。这种方式的实现是线程安全的,因为在类加载过程中实例已经创建好了。

public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}

懒汉式(Lazy Initialization):

在首次调用时创建单例实例,存在线程安全问题。如果多个线程同时进入判断条件,可能会创建多个实例。

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

为了解决懒汉式的线程安全问题,可以使用双重检查锁定(Double-Checked Locking):

public class ThreadSafeLazySingleton {private volatile static ThreadSafeLazySingleton instance;private ThreadSafeLazySingleton() {}public static ThreadSafeLazySingleton getInstance() {if (instance == null) {synchronized (ThreadSafeLazySingleton.class) {if (instance == null) {instance = new ThreadSafeLazySingleton();}}}return instance;}
}

在双重检查锁定中,使用了两次检查实例是否为null的条件判断,并使用synchronized关键字确保在创建实例时只有一个线程进入临界区。

静态内部类:

通过使用静态内部类来延迟加载单例实例,这种方式实现了线程安全性,并且只有在第一次访问getInstance()方法时才会加载内部类。

public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {}private static class SingletonHolder {private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.instance;}
}

以上是几种常见的单例模式的线程安全实现方式。根据具体的需求和性能要求,可以选择适合的实现方式。


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

相关文章

【UnityDOTS 二】Entity的理解

Entity的理解 Entity作为一种对CPU的Cache友好的编码方式,是DOTS中重要的编码流程与思想。需要程序员由OOP的思想转为DOD的思想,即:面向数据的编码方式。 Unity的ECS: Entity:只是一个代表,用于快速查找数…

笔记本电脑没有鼠标怎么右键_电脑鼠标右键没有反应怎么办?鼠标右键无法使用的解决方法...

鼠标右键无反应怎么办?电脑鼠标右键没有不能使用该如何解决?下面请看具体解决方法。 操作步骤: 1、按winr打开运行窗口,输入gpedit.msc,回车打开组策略编辑器,如图所示: 2、依次打开&#xff1a…

怎么查看苹果的蓝牙鼠标还有多少电量?

现在很多人都喜欢用蓝牙鼠标和键盘,比如苹果的蓝牙鼠标是充电的,那要怎么看鼠标还剩多少电呢? 1、首先进入到Mac桌面中,然后点击左上角的苹果图标。 2、然后在下拉的子菜单中选择“系统偏好设置”。 3、进入系统偏好设置后&#…

Mac 鼠标和触摸板左键突然失效

遇到了和 这位朋友 一样的问题,鼠标和触摸板的左键(触摸板是“单击”动作),都失效,变成了双击。 这位朋友 写到: 鼠标左键突然不起作用,触摸版也没用,右键可用. 原因:有两个蓝牙鼠标同时开着并…

计算机windows无响应,Windows电脑便笺没反应不能用了怎么办?

原标题:Windows电脑便笺没反应不能用了怎么办? Windows系统是很多人工作和生活中常用的电脑系统。Windows电脑具备自带的便签工具,就是便笺。它可以通过桌面便利贴的形式存放在电脑桌面上,查看和编辑待办记事内容。然而有时候Wind…

苹果鼠标右键怎么按_在 iPad 上用鼠标体验怎么样?我用这 12 款 App 试了一下

iPadOS 13.4 上线也已经有一个多月了,大家也通过各种方式体验上了 iPadOS 全新的触控板/鼠标操作。虽然全新的操作方式在系统和第一方应用里的体验不差,但对于没有对其进行适配的应用来说,触控板和鼠标也只能起到「模拟触控」的作用。 本文挑…

苹果鼠标右键怎么按_iPad 软件鼠标体验哪家强?12 款 App 对比测试

iPadOS 13.4 上线也已经有一个多月了,大家也通过各种方式体验上了 iPadOS 全新的触控板 / 鼠标操作。虽然全新的操作方式在系统和第一方应用里的体验不差,但对于没有对其进行适配的应用来说,触控板和鼠标也只能起到「模拟触控」的作用。 本文挑选了 12 款适配了触控板 / 鼠标…

linux系统鼠标左键失灵,苹果Mac笔记本触控板左键失灵原因分析与解决

绝大部分笔记本上都有标配触控板,这样就可以很好的代替鼠标操作,苹果笔记本也不例外,但是在使用过程中难免会遇到触控板失灵等问题。最近有用户在使用苹果MAC系统时突然发现触控板左键失灵而无法正常使用,出现这种现象主要是触控板…