Java 实现单例模式的几种方式

Python爬取腾讯视频m3u8加密流实战(附完整代码) 本文提供了一份详细的Python实战教程,指导如何通过抓包分析、模拟请求头与载荷,破解腾讯视频的m3u8加密流防盗链机制,并附上完整代码实现视频片段的下载与合并。教程涵盖从侦察到代码实现的完整流程,并包含参数动态化、多线程下载等高级技巧与避坑指南,旨在帮助开发者掌握流媒体下载的核心技术。 阅读详情

在面向对象的编程中,单例模式是一种常见的设计模式,它可以确保一个类只有一个实例,并提供了一个全局访问点。在Java中,单例模式有多种实现方式,本文将介绍其中的几种方式,并提供相应的示例代码。

在这里插入图片描述

饿汉式单例模式

饿汉式单例模式是最简单的一种实现方式,它在类加载时就创建了一个对象,并在需要时直接返回该对象。该方式的代码如下所示:

public class Singleton {
    private static final Singleton instance = new Singleton();

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

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

在该实现方式中,instance字段是一个私有的静态常量,它在类加载时就被初始化为一个Singleton对象。getInstance()方法返回该对象,以确保只有一个实例存在。

该实现方式的优点是非常简单易用,可以保证线程安全。但是它的缺点是当类加载时就创建了一个对象,无论是否需要,这会浪费一定的系统资源。

懒汉式单例模式

懒汉式单例模式是另一种常见的实现方式,它在需要时才创建对象。该方式的代码如下所示:

public class Singleton {
    private static Singleton instance;

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

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

在该实现方式中,instance字段是一个私有的静态变量,它在第一次调用getInstance()方法时才被初始化为一个Singleton对象。getInstance()方法使用synchronized关键字来确保线程安全。

该实现方式的优点是只有在需要时才创建对象,可以节约系统资源。但是它的缺点是当多个线程同时调用getInstance()方法时,可能会出现线程安全问题,因为在一个线程创建对象时,其他线程可能会同时访问instance字段。

双重检查锁定单例模式

双重检查锁定单例模式是一种更高效的实现方式,它在需要时才创建对象,并使用双重检查来确保线程安全。该方式的代码如下所示:

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;
    }
}

在该实现方式中,instance字段是一个私有的静态变量,它使用volatile关键字来确保可见性。getInstance()方法首先检查instance是否已经被初始化,如果没有,则使用synchronized关键字锁定类对象,然后再次检查instance是否已经被初始化。如果没有,就创建一个Singleton对象,并将其赋值给instance字段。

该实现方式的优点是既可以在需要时才创建对象,又可以确保线程安全。但是它的缺点是在某些JVM中,双重检查锁定可能会出现问题,因为JVM在创建对象和赋值给instance字段这两个操作之间可能会进行重排序,从而导致其他线程访问到一个未完全初始化的对象。

静态内部类单例模式

静态内部类单例模式是一种更加优雅的实现方式,它使用静态内部类来延迟初始化,从而避免了线程安全问题。该方式的代码如下所示:

public class Singleton {
    private Singleton() {
        // 私有构造函数
    }

    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

在该实现方式中,Singleton类的构造函数是私有的,而SingletonHolder类是一个静态内部类,它在需要时才创建Singleton对象。getInstance()方法返回SingletonHolder.instance,以确保只有一个实例存在。

该实现方式的优点是既可以在需要时才创建对象,又可以确保线程安全。而且它的代码非常简洁优雅。但是它的缺点是如果Singleton类的构造函数中抛出异常,可能会导致SingletonHolder类未被完全初始化。

总结

在Java中,单例模式有多种实现方式,每种方式都有其优点和缺点。饿汉式单例模式简单易用,但可能会浪费系统资源;懒汉式单例模式可以节约系统资源,但可能会出现线程安全问题;双重检查锁定单例模式既可以在需要时才创建对象,又可以确保线程安全,但在某些JVM中可能会出现问题;静态内部类单例模式既可以在需要时才创建对象,又可以确保线程安全,而且代码简洁优雅。根据具体的需求,选择合适的实现方式非常重要。

Misc-RAR隐写 题目来自于:XCTF的SimpleRAR,由于涉及到许多新知识,所以写篇小文子记录一下。 一、下载完后是一个压缩包。 里面就有一个flag.txt,打开之后发现有一串字符是flag is not here,而且我们查看他的文件大小,只要十六字节,绝对不可能再藏着什么信息了。 然后把压缩包拉到010editor里面,发现一下子出来好多新的内容,很明显是有夹杂着的附加文件。 二、rar文件头信息。 rar 是由一个一个 block 组成的,每个 block 有以下几个部分 ... 阅读详情

相关推荐

VS2022离线安装总闪退?可能是这个--noWeb参数没加对(完整参数指南)

本文深入解析了VS2022离线安装过程中常见的闪退问题,指出核心原因往往在于命令行参数使用不当,特别是`--noWeb`参数。文章提供了完整的参数使用指南和实战解决方案,包括证书处理、安装器文件修复及自动化脚本,帮助用户彻底解决离线部署中的验证失败与闪退难题。

weixin_28842269的博客 758

FTPClient与commons-pool2

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34082854的博客 192

如何下载安装Qt各个版本?(2025-4-28更新)

本文将教您快速获取Qt各版本安装包!妈妈再也不用担心我找不到Qt安装包了!

程序区 5120

使用静态内部类实现单例设计模式

前几天看了下公司代码中的一个单例类,发现居然是用静态内部类实现的。后面在网上找了下资料,发现使用静态内部实现的单例是懒加载的且线程安全。 从网上资料得出如下结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。一、代码package com.zxy.test; /** ...

154

20道SpringSecurity常见面试题汇总(超详细回答 !!!)

本文中,我们将探讨一些与 Spring Security 相关的面试问题。Spring Security 是一款流行的 Java 应用程序安全框架,它提供了一套全面且易于使用的安全解决方案。

小斜同学的博客 3076

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

Java 枚举实现单例模式,线程安全又优雅!

枚举在序列化和反序列化时,并不会调用构造方法,这就防止了反序列化导致的单例破坏的问题。反编译任何一个枚举类会发现,枚举类里的各个枚举项是是通过static代码块来定义和初始化的(可以见后面3.2节反编译分析单例枚举有分析到这个),它们会在类被加载时完成初始化,而java类的加载由JVM保证线程安全,所以,创建一个Enum类型的枚举是线程安全的。因为存在着指令重排序的优化,第2、3步的顺序是不能保证的,最后的执行顺序可能是1-2-3,也可能是1-3-2,假如执行顺序是1-3-2,我们看看会出现什么问题。

Java技术栈,分享最主流的Java技术 296

AD学习笔记(一)基础认识

文章目录AD学习笔记第一讲 AD基础认识一、两库两图(分别对应下图)1、PCB图(pcbdoc)2、原理图(schdoc)3、原理图库(schlib)4、PCB库(pcblib)二、封装1、DIP封装2、LQFP封装三、绘制整体流程1、建立工程(PrjPcb)2、建立两库两图并保存整个工程(五次)3、从库中提取绘制原理图4、原理图导入pcb图5、根据原理图布线6、pcb图交由工厂打板 AD学习笔记 第一讲 AD基础认识 一、两库两图(分别对应下图) PCB图(pcbdoc) 原理图(schdoc) PCB库

qq_52465473的博客 6686

Java单例模式详解(五种实现方式)

Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。例如:一个日志记录器(Logger)。在一个应用程序中,可能有多个组件需要记录日志,但是我们希望只有一个日志记录器实例来避免重复创建和管理多个日志文件。使用单例模式,我们可以确保只有一个日志记录器实例存在,并且所有组件都可以共享该实例来记录日志。这样可以简化日志记录的管理,并确保日志信息的一致性。

qq_64680177的博客 4183

OmniDrive(2):环境搭建

项目中使用的是全量的数据集(full dataset v1.0), 数据量比较大,训练验证(trainval) + test 总计200多G的数据,单独一个个下载会比较慢。参数,否则安装的时候会自动卸载已安装好的torch,重新安装最新版本的torch,这是不允许的。在cuDNN官网下载,默认下载的是最新版本的cuDNN,我们这里点击。,== 博文中详细介绍了完整的cuda和cudnn的安装过程==分析: 这是因为yapf 安装的版本不对,需要安装特定的版本。出现训练的loss变化,就说明可以正常训练了。

@bangbang的博客 623

英飞凌TC3xx之一起认识GTM(八)如何使用DTM实现死区时间配置

本文简要介绍英飞凌TC3xx系列芯片的DTM模块结构,以及有哪些相关寄存器可用于实现相关配置。

无所适从的我的博客 4650

Java中的单例模式大盘点:八仙过海各显神通

单例模式是一种非常常用的设计模式,可以确保类只有一个实例,并提供全局访问点以访问该实例

做一个有思想的技术人 923

智能工厂评估模型研究

摘要:通过对国内外现有智能制造评估模型的研究,结合重庆制造业行业领跑者与落后者之间差距大的现状,以实现全要素全连接的数字化工厂为出发点,融合工业互联网标识,构建实践可行的智能工厂评估模型推动中小型企业参与智能制造转型,缓和两极分化问题。本评估模型包含工厂体系架构的3个层级,提供用于推动智能制造转型的参考,包括设计、生产、管理的全过程评估。关键词:智能制造评估模型;智能制造转型;全连接工厂;工业互联网标识0 引言受行业需求与技术创新的影响,全球制造业在历经了工业1.0机械化、工业2.0电气化和工业3.0自动

罗伯特技术屋 677

Java单例模式的几种实现方式

枚举单例由于其简洁性、线程安全性、自动支持序列化以及防止反射攻击的特性,通常被认为是实现单例模式的最佳实践之一。然而,在某些情况下,如果单例类需要延迟加载或者初始化过程非常耗时,可能需要考虑其他实现方式。选择哪种实现方式,需要根据具体的应用场景和需求来决定。

qq_41914451的博客 1256

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java单例模式有几种实现方式

利用JVM类加载机制保证线程安全。关键字确保可见性,减少同步开销。天然支持线程安全与序列化防护。

DKPT的博客 933

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java单例模式几种实现方式

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式结构图: 单例模式有多种写法各有利弊,现在我们来看看各种模式写法。 1. 饿汉模式 public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){ } public static Singleton getInstance() { ...

weixin_43865381的博客 252

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java单例模式几种实现方式

在平时的工作、学员的学习以及面试过程中,单例模式作为一种常用的设计模式,会经常被面试官问到,甚至笔试会要求学员现场默写,下面将会就单例模式的实现思路和几种常见的实现方式进行简单的分享。 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。是最常用到的设计模...

alposbo7523的博客 179

java单例模式 几种_Java单例模式的几种常见实现方式

Java单例模式的几种常见实现方式懒汉or饿汉?懒汉:单例模式延迟加载方式,一开始不给你new对象,你要new再给你new饿汉:上来就给你new好一个对象,你可以直接用(吃),你也没法new饿汉:不加锁,线程安全,用起来方便,容易产生垃圾对象public class SingletonTest1 {public static void main(String[] args) {//由于构造方法是私...

weixin_31837543的博客 138

Java实现单例模式的几种方式

1. 饿汉式 /** * 饿汉式(在类初始化时,已经自行实例化) * * @author: Charle~ * @date: 2020-03-13. **/ public class Singleton { //私有的默认构造器 private Singleton() {} private static Singleton instance = new Si...

u010986887的博客 194

java设计模式之单例模式的几种实现方式

单例模式 单例模式确保某一个类只有一个实例,而且自行实例化,这个类提供了访问其唯一对象的方式,可以直接访问,不需要实例化该对象。 单例模式的几种实现方式 1、懒汉式(线程不安全) public class Singleton{ private static Singleton instance; //私有构造函数 private Singleton(){} ...

XTAOTWO的博客 341

JAVA中单例模式的几种实现方式

1、饿汉式(线程安全,调用效率高,但是不能延时加载): publicclassImageLoader{ privatestaticImageLoaderinstance=newImageLoader; privateImageLoader(){} publicstaticImageLoadergetInstance(){ returninstance; } } 一上来就把单例对象创建出来了,要用的时候直接...

LHH201016的博客 175

java单例模式几种常见实现方式

什么是单例模式 因进程需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。 单例模式的特点 1、单例模式只能有一个实例。 2、单例类必须创建自己的唯一实例 3、单例类必须向其他对象提供这一实例。 单例模式的实现 懒汉式(线程不安全) public class SingletonDemo { private static SingletonDemo instance; private SingletonDemo(){ } ..

a904364908的博客 541

java单例实现方式_Java单例模式实现的几种方式

java单例模式实现的几种方式单例模式好多书上都是这么写的:public class SingleTon1 {private SingleTon1(){}private static SingleTon1 instance = null;public static SingleTon1 getInstance(){if(instance == null){instance = new Single...

weixin_33066321的博客 114
下一篇: Java 中适配器模式有哪些适用模式
stormjun
博客等级 码龄4年 634粉丝 136原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stormjun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值