iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现线程安全单例模式的五种方式的示例代码
  • 600
分享到

Java实现线程安全单例模式的五种方式的示例代码

2024-04-02 19:04:59 600人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录饿汉式枚举单例懒汉式DCL 懒汉式静态内部类懒汉单例饿汉式 饿汉式:类加载就会导致该单实例对象被创建 // 问题1:为什么加 final // 问题2:如果实现了序列化接口, 还

饿汉式

饿汉式:类加载就会导致该单实例对象被创建

// 问题1:为什么加 final
// 问题2:如果实现了序列化接口, 还要做什么来防止反序列化破坏单例
public final class Singleton_hungry implements Serializable {

    // 问题3:为什么设置为私有? 是否能防止反射创建新的实例?
    private Singleton_hungry(){}

    // 问题4:这样初始化是否能保证单例对象创建时的线程安全?
    private static Singleton_hungry INSTANCE = new Singleton_hungry();

    // 问题5:为什么提供静态方法而不是直接将 INSTANCE 设置为 public, 说出你知道的理由
    public static Singleton_hungry getInstance() {
        return INSTANCE;
    }
    public Object readResolve(){  // 防止反射创建新的实例?
        return INSTANCE;
    }
}
  • 问题1:避免子类覆盖父类的一些方法,导致线程不安全。
  • 问题2:实现 readResolve 方法。当从对象流 ObjectInputStream 中读取对象时,会检查对象的类否定义了 readResolve 方法。如果定义了,则调用它返回我们想指定的对象(这里就指定了返回单例对象)。
  • 问题3:防止通过 new 创建对象实例。不能防止反射创建新的实例。
  • 问题4:可以。静态变量初始化在类加载时进行,由 JVM 进行管理,可以保证线程安全。
  • 问题5:通过方法,可以提高拓展性,改进饿汉式转化为懒汉式、利用泛型特性、增加对单例对象的控制操作。

枚举单例

enum Singleton { 
   INSTANCE; 
}

问题1:枚举单例是如何限制实例个数的

单例相当于枚举的静态成员变量,定义几个就有几个实例。

问题2:枚举单例在创建时是否有并发问题

单例相当于枚举的静态成员变量,类加载时初始化,由 jvm 进行管理,可以保证线程安全。

问题3:枚举单例能否被反射破坏单例

不能

问题4:枚举单例能否被反序列化破坏单例

枚举实现了 Serializable 接口,可序列化,但不会被反序列破坏单例。

问题5:枚举单例属于懒汉式还是饿汉式

饿汉式

问题6:枚举单例如果希望加入一些单例创建时的初始化逻辑该如何做

枚举允许构造方法

懒汉式

public final class Singleton_lazy {
    private Singleton_lazy(){}
    private static Singleton_lazy INSTANCE = null;
    // 缺点
    public static synchronized Singleton_lazy getInstance() {
        if(INSTANCE != null) {
            return INSTANCE;
        }
        INSTANCE = new Singleton_lazy();
        return INSTANCE;
    }
}

synchronized 保证线程安全,但粒度较大,性能低。

DCL 懒汉式

public final class Singleton_DCL {

    private Singleton_DCL() {}

    // 问题1:解释为什么要加 volatile ?
    private static volatile Singleton_DCL INSTANCE= null;

    // 问题2:对比实现3, 说出这样做的意义
    public static Singleton_DCL getInstance() {
        if(INSTANCE != null) {
            return INSTANCE;
        }
        synchronized (Singleton_DCL.class) {
          
            // 问题3:为什么还要在这里加为空判断, 之前不是判断过了吗
            if(INSTANCE != null) {
                return INSTANCE;
            }
            INSTANCE = new Singleton_DCL();
            return INSTANCE;
        }
    }
}

问题1:避免指令重排序,导致赋值语句先于构造函数执行,得到一个未初始化完毕的对象。

问题2、3:Double Check Lock 机制。同步代码块外部的判断语句主要用于 INSTANCE 初始化并赋值之后,此时 INSTANCE != null,如果有多个线程尝试获取单例,可以提前返回,不用执行同步代码块。而同步代码块内部的判断主要用于第一次初始化时,INSTANCE = null,此时可以有多个线程尝试获取 INSTANCE,只能有一个线程进入同步代码块,其他线程在同步代码块外阻塞,该线程创建一个单例对象之后,唤醒其他线程,再进入同步代码块,发现 INSTANCE != null,则直接返回,不用重新创建单例对象,提高了效率。

静态内部类懒汉单例

public final class Singleton_LazyHolder {
    private Singleton_LazyHolder(){}

    // 问题1:属于懒汉式还是饿汉式
    private static class LazyHolder{
        static final Singleton_LazyHolder INSTANCE = new Singleton_LazyHolder();
    }

    // 问题2:在创建时是否有并发问题
    public static Singleton_LazyHolder getInstance() {
        return LazyHolder.INSTANCE;
    }
}

问题1:懒汉式。静态内部类只有在被方法调用的时候才进行初始化,类加载。

问题2:无,类加载由 jvm 进行,线程安全。

到此这篇关于Java实现线程安全单例模式的五种方式的示例代码的文章就介绍到这了,更多相关Java单例模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现线程安全单例模式的五种方式的示例代码

本文链接: https://www.lsjlt.com/news/144243.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现线程安全单例模式的五种方式的示例代码
    目录饿汉式枚举单例懒汉式DCL 懒汉式静态内部类懒汉单例饿汉式 饿汉式:类加载就会导致该单实例对象被创建 // 问题1:为什么加 final // 问题2:如果实现了序列化接口, 还...
    99+
    2024-04-02
  • Java单例模式的五种实现方式
    目录前言饿汉单例懒汉单例非线程安全的懒汉单例加同步锁的懒汉单例双重检验懒汉单例静态内部类静态内部类为什么是线程安全总结前言 单例模式(Singleton Pattern)是 Java...
    99+
    2024-04-02
  • C++单例模式实现线程池的示例代码
    C语言单例模式实现线程池。 该代码中,使用了单例模式来创建线程池对象,保证了整个程序中只有一个线程池对象。 线程池中包含了任务队列、工作线程数组、互斥锁、条件变量等成员,通过这些成员...
    99+
    2023-05-16
    C++单例模式实现线程池 C++单例模式 线程池 C++ 线程池 C++ 单例模式
  • Java实现单例模式的五种方法介绍
    目录饿汉式懒汉式双重检查锁静态内部类内部枚举类实现饿汉式 立即加载 防止new对象,构造私有,写一个公共的方法返回对象 占用空间,线程安全 public class Singleto...
    99+
    2023-01-31
    Java单例模式 Java单例模式实现方式
  • Java 单例模式线程安全问题
    Java 单例模式线程安全问题SpringIOC容器默认提供bean的访问作用域是单例模式。即在整个application生命周期中,只有一个instance。因此在多线程并发下,会有线程安全风险。我们在MVC框架下的servlet就是线程...
    99+
    2023-05-31
    java 单例模式 线程安全
  • Java单例模式中的线程安全问题
    目录一. 使用多线程需要考虑的因素二. 单例模式1. 饿汉模式2. 懒汉模式3. 懒汉模式(使用synchronized改进)4. 懒汉模式(使用双重校验锁改进)三. volatil...
    99+
    2024-04-02
  • 分析java中全面的单例模式多种实现方式
    目录一、单例模式的思想二、单例模式的 N 种实现方式2.1、饿汉式(线程安全,可用)2.2、常量式(线程安全,可用)2.3、懒汉式(线程不安全,并发场景不可用)2.4、同步的懒汉式?...
    99+
    2024-04-02
  • Java单例模式的6种实现方式详解
    目录为什么使用单例模式使用单例模式需要注意的关键点单例模式的几种写法1. 饿汉式2. 懒汉式3. DCL(Double CheckLock)实现单例4. 静态内部类5...
    99+
    2024-04-02
  • Android 单例模式的四种实现方式
    目录一.饿汉式二.懒汉式三.双重检查加锁方式四.静态内部类方式总结一.饿汉式 public class SingletionStarving { private sta...
    99+
    2024-04-02
  • C#实现单例模式的多种方式
    什么是单例模式 这里我就不做过多的解释了, 毕竟关于Singleton的资料实在是太多太多了。点击这里 简单的思路就是, 创建对象单例的动作转移到另外的行为上面, 利用一个行为去创建...
    99+
    2024-04-02
  • Java单例模式的线程安全,饿汉和懒汉模式详解
    单例模式 创建唯一的一个变量(对象),在类中将构造函数设为protected或者private(析构函数设为相对应的访问权限),故外部不能实例化对象,再提供访问它的一个全局访问点,即...
    99+
    2024-04-02
  • Python实现单例模式的五种写法总结
    目录使用模块使用装饰器基于 __new__ 方法实现基于 metaclass 方式实现单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保...
    99+
    2024-04-02
  • java编程创建型设计模式单例模式的七种示例
    目录1.什么是单例模式?2.七种写法2.1 饿汉式(静态常量)2.2 饿汉式(静态代码块)2.3 懒汉式(线程不安全)2.4 懒汉式(线程安全,同步方法)2.5 双重校验锁2.6 静...
    99+
    2024-04-02
  • rabbitmq五种模式的示例分析
    这篇文章主要介绍了rabbitmq五种模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、五种模式详解1.简单模式(Queue模式)当生产端发送消息到交换机,交换...
    99+
    2023-06-14
  • java 单例的五种实现方式及其性能分析
    java 单例的五种实现方式及其性能分析序言在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式。从单例的五种实现方式中我们可以看到程序员对性能的不懈追求。下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进...
    99+
    2023-05-31
    java 单例 ava
  • Java中单例模式与多线程的示例分析
    这篇文章主要介绍了Java中单例模式与多线程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单例模式与多线程单例模式就是全局唯一但是所有程序都可以使用的对象写单例模式...
    99+
    2023-06-20
  • Java中单例模式的七种写法示例
    目录前言1、饿汉式(线程安全)⭐2、懒汉式(线程不安全)⭐ 3、懒汉式(加锁)4、懒汉式(双重校验锁)⭐5、单例模式(静态内部类)6、单例模...
    99+
    2024-04-02
  • java单例模式实现代码怎么写
    在Java中实现单例模式有多种方式,以下是其中几种常用的实现方式: 饿汉式(线程安全): public class Single...
    99+
    2023-10-24
    java
  • javascript遍历对象的五种方式实例代码
    目录准备 五种武器 for…in Object.keys Object.getOwnPropertyNames Object.getOwnPropertySymbols Reflec...
    99+
    2024-04-02
  • Java中的多线程如何实现单例模式
    这期内容当中小编将会给大家带来有关Java中的多线程如何实现单例模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java多线程中的单例模式一、在多线程环境下创建单例方式一:package com.iet...
    99+
    2023-05-31
    java 线程 单例模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作