java单例模式几种实现方法

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南 本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。 阅读详情

java单例模式中,留意几个关键点:构造方法私有化,单例对象变量需要static修饰,借助公有方法获取单例对象。另外也需要考虑线程是否安全,是否为延迟加载。

饿汉模式

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

饿汉模式可以保证线程安全,但是却不是延迟加载。这里扩展说一下延迟加载:我们知道类加载包括加载,链接和初始化阶段,而链接又分为:验证,准备和解析,对于静态变量,在准备阶段会赋值默认值,这里就是为instance赋予null,而在初始化阶段会赋值用户设定的值,这里就是new Hungry()。也就是说,一旦这个Hungry类被加载了(使用new关键字获取,反射forName()等都会触发类加载),那么内存就会分配一个空间存放new Hungry()对象,而更多地时候,我们并不是为了使用这个Hungry对象才加载这个类的,这就会占用额外的内存空间。所以引入延迟加载概念就是将初始化instance放到需要用到这个对象的时候。下面介绍的懒汉模式就可以实现延迟加载。

懒汉模式

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

懒汉模式解决了延迟加载,但是却没有考虑到线程安全,多个线程可能会同时进入if语句,导致各个线程获得的对象不同。下面列出两个改进方法:

public class Lazy{
    private static Lazy instance=null;
    private Lazy(){}
    //使用synchronized关键字修饰
    public static synchronized Lazy getInstance(){
        if(instance==null)instance=new Lazy();
        return instance;
    }
}

线程是安全了,但是也要保证效率,synchronized是互斥锁,而且还需要操作系统切换线程上下文,得不偿失。进一步优化:

/*
 * 假设线程A、B
 * Step1:A进入同步代码块
 * Step2:B进入getInstance(),发现instance==null,进入if,锁被占用,阻塞
 * Step3:A执行完同步代码块,释放锁
 * Step4:B获得锁,发现instance已实例化,退出
 * 
 * 如果不进行第二次判定,B线程进入后会再次执行instance=new DoubleLock() 导致获取不同的实例
 */
public class Lazy {
    private static Lazy instance = null;
    private Lazy() {}
    public static Lazy getInstance() {
        if (instance == null) {
            synchronized (Lazy.class) {
                if (instance == null)
                    instance = new Lazy();
            }
        }
        return instance;
    }
}

对于DCL(双重检查锁),其实存在着不少的争执,在《Java并发编程实战》中文版一书中说道:

DCL的真正问题在于:当在没有同步的情况下读取一个共享对象时,可能发生的最糟糕事情只是看到一个失效值(在这种情况下是一个空值),此时DCL方法将通过在持有锁的情况下再次尝试来避免这种风险,然而,实际情况远比这种情况糟糕——线程可能看到引用的当前值,但对象的状态值却是失效的,这以为这线程可以看到对象处于无效或错误的状态。

由于bo主技术有限,如果想要深入理解,可以参考这篇博文。

延迟初始化占位类模式(瞬间高大上)

说白了,就是将单例对象放入一个私有静态内部类中,上代码:

public class Outer {
    private Outer(){}

    private static class Inner{
        private static Outer instance=new Outer();
    }

    public static Outer getInstance(){
        return Inner.instance;
    }

    public static void other(){}
}

当我们调用Outer类其他方法时,并不会加载Inner类,起到延迟初始化的作用,当且仅当我们调用getInstance()时,需要返回Inner类的静态变量,这时候类加载器才会加载我们的Inner类。这种方法是线程安全的。

枚举类型

这种方法最为简洁,同时也保证了延迟加载和线程安全。

enum EnumModel {
    INSTANCE;
    private EnumModel(){}
}

需要调用时,直接EnumModel.INSTANCE 方便快捷。

ESP-SR实战:从零搭建智能语音唤醒与命令识别系统 本文详细介绍了如何利用乐鑫ESP-SR框架,从零开始搭建一个完整的离线智能语音交互系统。内容涵盖硬件选型(推荐ESP32-S3与数字麦克风)、开发环境配置(ESP-IDF与ESP-ADF),并深入解析了AFE声学前端、WakeNet唤醒词检测和MultiNet命令词识别三大核心模块的工作原理与实战配置。通过具体的代码示例和调试技巧,指导开发者快速实现高识别率的语音唤醒与命令控制功能。 阅读详情

相关推荐

基于MATLAB实现的克里金插值的代码

参考代码 克里金插值matlab代码 youwenfan.com/contentcsb/81657.html。

jghhh01的博客 480

java 单例模式(5种实现方式)

单例模式的五种实现方式

qq_53844452的博客 2622

用OpenCV+ROS实现焊接机器人智能纠偏:线激光视觉的算法调参全流程

本文详细介绍了基于OpenCV和ROS的焊接机器人智能纠偏系统全流程。通过线激光视觉系统实时感知焊缝,重点解析了抗干扰图像预处理、改进的Steger算法提取激光条纹中心线,以及从2D像素到机器人基坐标系的完整坐标变换。该系统为应对焊接飞溅、弧光等复杂工况,实现高精度实时路径纠偏提供了从算法优化到工程集成的完整解决方案。

vodka的博客 158

单例模式及处理线程安全

单例模式及解决线程安全

sinat_36183608的博客 679

Alphafold2/multimer本地安装避坑指南:从Conda环境配置到GPU加速实战

本文详细介绍了Alphafold2/multimer本地安装的全流程,从Conda环境配置到GPU加速实战,特别针对常见的报错处理提供了解决方案。通过硬件环境检查、依赖安装技巧、OpenMM补丁应用等步骤,帮助研究人员高效部署蛋白质结构预测工具,提升计算效率。

weixin_29309213的博客 115

逆向工程的艺术:如何绕过PDD的长连接机制实现高效抓包

本文深入解析了如何通过逆向工程技术绕过拼多多(PDD)的长连接机制实现高效抓包。详细介绍了动态调试方案、关键函数Hook技巧及流量解密重组方法,帮助开发者在非Root环境下捕获并解析PDD的加密数据。结合Python工具链,实现稳定数据采集,适用于电商数据分析和反爬策略研究。

weixin_29058331的博客 674

设计模式-创建型模式-单例模式

单例模式 单例模式的目的是用户每次请求 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重检查 静态内部类 枚举 单例模式小结 ...

qq_38089996的博客 508

如何创建属于自己的大语言模型:从零开始的指南

随着人工智能的快速发展,大语言模型(LLM)在各种场景中表现出了卓越的能力,例如文本生成、对话交互和内容总结等。本文将带你了解创建 LLM 的核心步骤,从理论到实践,让你拥有一个自己的智能助手。

赵大仁的博客 3280

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

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

qq_64680177的博客 4183

A-Frame引擎开发:A-Frame基础入门_(11).A-Frame物理引擎集成

在上一节中,我们学习了如何在A-Frame中创建基本的3D场景和交互元素。然而,为了使虚拟现实游戏更具真实感和互动性,物理引擎的集成是必不可少的。物理引擎可以模拟现实世界中的物理行为,如重力、碰撞、摩擦等,从而增强用户的沉浸感。物理引擎在虚拟现实游戏中的重要性不言而喻。它不仅能够模拟物体的运动和相互作用,还能为游戏提供更真实的反馈和体验。例如,当玩家在虚拟世界中推动一个物体时,物理引擎可以确保物体按照预期的方式移动,而不是简单地穿墙而过或突然消失。重力是物理引擎中最基本的特性之一。在A-Frame中,我们可

chenlz2007的博客 794

【华为OD机试】真题-小明减肥(Java)

摘要:题目要求从n个可选运动中选取k个,使其卡路里总和等于目标值t,统计可行方案数。输入包含运动数量n、目标t、选择数量k及卡路里数组。采用DFS回溯算法,通过剪枝优化(提前终止无效分支),分别处理选择/不选当前运动的情况。当遍历完所有运动且满足条件时计数。示例输入"4 3 2"和"1 2 3"时,输出2(对应两种选择组合)。Java实现通过递归完成搜索,最终输出符合条件的方案总数。(149字)

u014481728的博客 282

java中单例模式的实现

什么是单例模式?单例模式是java设计模式的一种,这个模式的目的就是保证某一个类只有一个实例存在。比如我们java中的DataSource数据源就是需要只有一个实例,是单例模式的一种实现。单例模式由于在内存中只有一个实例,减少了内存的开销,当我们频繁的创建和销毁实例时,并且该模式还能避免对资源的多重占用。单例模式中我们主要分为饿汉模式和懒汉模式,以下介绍这两种模式以及实现方式。

薯条和番茄酱的博客 439

使用 Simulink 进行电力电子系统的效率优化仿真

电力电子系统(Power Electronics System)是现代电力系统和工业自动化中的关键组成部分,广泛应用于可再生能源发电、电动汽车、不间断电源(UPS)、电机驱动等领域。为了提高系统的整体性能和经济性,必须对电力电子系统的效率进行优化。效率优化的目标是最大化系统的能量转换效率,减少损耗,从而提高系统的可靠性和经济效益。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的效率优化策略。本教程将详细介绍如何使用 Simulink 进行电力电子系统的效率优化仿真。

xiaoheshang_123的博客 355

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

单例模式是一种常用的软件设计模式,其目的是确保一个类在任何情况下只有一个实例,并提供一个全局访问点供外部获取这个唯一的实例。这种模式特别适用于那些具有全局状态的场合,如配置管理器、线程池、缓存、对话管理等。

lt5227的博客 1393

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

设计模式之单例模式 Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。” 饿汉式:类加载的时候就实例化,并且创建单例对象。 //饿汉式 :类加载的时候就实例化,并且创建单例对象。 public class Hungry { public Hungry() { System.out.println(Thread.currentThread().getName()+"ok"); } private static final Hungr

一不小心做了程序员的博客 411

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

java单例模式的几种常见实现方法,饿汉模式、懒汉模式、内部类方式,什么样的实现方式是线程安全的,什么样不是线程安全的,什么较为推荐较为不推荐,在本文中阐释。

qq_38349413的博客 264

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java中实现单例模式的几种方法

实现单例模式的几种方式:饿汉式、懒汉式、静态内部类、枚举类,以及通过反射破坏单例的方法

m0_56343209的博客 1701

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

1 饿汉式单例类.在类初始化时,已经自行实例化  class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton(); /** * 私有的默认构造子 */ private EagerSingleton() { }

Code Heaven 1085

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

Java-创建单例模式的几种方法

weixin_62398984的博客 342

Java单例模式的这几种实现方法,你真的了解吗?

采取一定的方法,让软件系统一个类只能创建和使用一个实例对象,并提供一个取得对象的方法单例模式保证系统中这个类只有一个对象,节省了系统资源,适当使用可以提高系统性能使用场景:需要频繁的创建和销毁对象、创建对象耗时过多但需要经常用到的、业务要求只能有一个实例的对于饿汉式,实现比较简单易懂也线程安全,如果能保证类会至少使用一次完全是可以使用的对于懒汉式,主要的就是注意线程安全问题。

GHSTART的博客 1962

java单例模式的实现方法_JAVA单例模式的几种实现方法

1 饿汉式单例类.在类初始化时,已经自行实例化class EagerSingleton {private static final EagerSingleton m_instance = new EagerSingleton();/** * 私有的默认构造子 */private EagerSingleton() {}/*** * 静态工厂方法*/public static EagerSinglet...

weixin_39752941的博客 173

java面试之单例模式的实现方法(几种单例模式)

说句实话, 这个问题把我问的一脸懵逼, 怎么会有这种面试题? 你如果问我双重检查锁的单利模式实现的利弊, 还ok, 第一次碰到, 网上百度下 , 真TMD有, 现在贴出来跟大家分享, 尤其注意 双重检查锁的单利模式就好了!     需要确保某个类只要一个对象,或创建一个类需要消耗的资源过多,如访问IO和数据库操作等,这时就需要考虑使用单例模式了。 使用单例模式需要注意的关键点 将构造...

wyc199186的专栏 468
上一篇: Java死锁例子
下一篇: 广州YY面经
HamalAlpha
博客等级 码龄11年 5粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值