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

Java创建型设计模式-单例模式 好啦,以上就是关于java设计模式的单例模式详细介绍,整理出八种初始化方式及其利弊分析,最佳方式推荐是3.4章节的线程安全单例。 阅读详情

1、单例模式

    知识点:
    1、模式定义:一个类只有一个实例,提供一个全局的访问点
       应用场景:重量级别的对象,不需要多个实例,如线程池,数据库连接池等
       类图分析:实例对象a 和 一个getInstance方法
        
    2、字节码知识,字节码指令重排序
        通过javap -v a.class 查看指令过程

        创建对象(会涉及到指令排序),会有四个步骤
        1 分配对象的内存空间
        2 初始化对象
        3 设置instance指向刚分配的内存地址
        4 返回
        
        指令顺序可能会经过JVM和CPU的优化,指令重排(2,3步骤可能会错乱导致会出现多个实例)
        
        解决指令重排的方法,volatile关键字,会让JVM的顺序按照指定顺序执行
        
    3、类加载机制
        3.1、加载二进制数据到内存中,生成对应的Class数据结构
        3.2、连接:a 验证(class是否符合jvm规范) b 准备(给类的静态变量赋值) c 解析
        3.3、初始化:给类的静态变量赋初始值
        
        真正使用类时,才会进行初始化
        
    4、JVM序列化机制
    
        静态内部类--需要实现readResolve()方法,才支持反序列化
            
            实现serializable接口,并生成序列id(不生成的话,就会导致序列化和反序列化的对象不相同)
            
            //序列化-该对象必须实现serializable
            objectOutPutStream.writeObject(对象实例A)  
            //反序列化
            A = objectOutPutStream.readObject();
            默认情况下,序列化和反序列化两个对象是不相同的
                要想一致,对象A必须要新增readResolve()方法(serializable接口中说明),返回单例对象A
        
        枚举--本身就支持反序列化,不需要添加任何操作
        
        
    5、单例模式在spring框架 和  JDK源码中的应用
    
    
    
    6、五种实现方式
        
        1.1、懒汉式,用到才会new对象----延迟加载,不安全(1、方法级别锁,影响性能,2、代码块锁)
            static A a;
            A static getInstance(){  if(A == null) { a = new A();}}
            
        1.2、饿汉式,先new对象
        
        1.3、上述都是线程不安全的-----双重检测机制-线程安全-懒加载-不能防止反射
            A static getInstance(){             
                if(A == null) { 
                    synchronized(A.class){     
                        if(A == null) { 
                            a = new A();
                        }
                    }    
                }
                return a;
            }
            双重检测机制,以上还有一个隐藏漏洞
                通过javap -v a.class 查看指令过程
                
                创建对象涉及到指令重排
                    instance = new Singleton() 这行代码会被编译器译成如下JVM指令
                    memory = allocate() // 1 分配对象的内存空间
                    ctorInstance(memory) // 2 初始化对象
                    instance = memory // 3 设置instance指向刚分配的内存地址
                
                指令顺序可能会经过JVM和CPU的优化,指令重排(2,3步骤可能会错乱)
                    memory = allocate() // 1 分配对象的内存空间
                    instance = memory // 3 设置instance指向刚分配的内存地址
                    ctorInstance(memory) // 2 初始化对象
                
                这样就导致不为null时,对象还没初始化完成,这样会返回一个未初始化完成的对象
                
                
            解决方案:需要在instance对象的前面增加一个volatile修饰词
                volatile关键字,会让JVM的顺序按照指定顺序执行
                
        1.4、静态内部类实现-线程安全-懒加载-不能防止反射
            private static class Holder{
                private static final Singleton INSTANCE = new Singleton()
            }
            
            private Singleton(){}
            
            public static Singleton getInstance(){
                return Holder.INSTANCE;
            }
            
            内部使用classloader来保持线程安全的
            
            缺陷:可以通过反射,创建对个对象(1、获取构造器 2、设置构造器可用 3、newInstance方法构造对象)

            如何阻止反射:
                1、枚举
                2、在默认构造方法中,再次判断实例是否为空,不为空就自定义异常,防止反射调用
            
        1.5、枚举-线程安全-不是懒加载-能防止反射------------优先使用
            public class Singleton {
                public enum SingletonEnum{
                    INSTANCE;
                    private Singleton singleton;
                    
                    private SingletonEnum(){
                        System.out.print("初始化单例")
                        singleton = new Singleton();
                    }
                    
                    private Singleton getInstance(){
                        return singleton;
                    }
                }
                
                private Singleton(){}
                
                public static Singleton getInstance(){
                    return SingletonEnum.INSTANCE.getInstance();
                }
                
            }

【Java设计模式 - 创建型模式1】单例模式 java设计模式之单例模式简介场景实现单例模式的几种实现方式懒汉式,线程不安全懒汉式,线程安全饿汉式双检锁/双重校验锁(DCL,即 double-checked locking)登记式/静态内部类枚举 简介 之所以最开始先写单例模式,原因在于单例模式可能大多数小白也用过,而且也是初级java面试常考查的一种模式,也是相对于较简单的一种设计模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访 阅读详情

相关推荐

fMRI数据处理:从DICOM到NIFTI(上)

哈喽,这里是系列fMRI数据处理文章专栏。包括从核磁拷贝完DICOM格式的文件,到整理数据,检查数据,数据预处理,后续分析等等内容。如果你是一个初学者,特别是心理学或者是刚踏入认知神经科学的小白,那么这个专栏可以帮助你从头到尾完成数据处理直到结果的可视化。如果你已经进入了认知神经科学领域,这里面的内容可能过于细致,并且找不到你想要的答案,不过可以在帖子下留言评论,欢迎大家提供宝贵的意见!如果是医学相关,可能这些内不太准确或专业,谨慎参考!

weixin_44933894的博客 2482

【Java 设计模式 · 创建型】单例模式(Singleton Pattern)

单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。

茶色喵的博客 546

Mac新手必看:nvm安装全攻略(含常见错误解决方案)

本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。

weixin_28839699的博客 1616

Java设计模式:创建型模式→单例模式

Java设计模式:创建型模式→单例模式 详解;

专注分享技术、实用优质教程、资源 1874

WorldQuant Brain Alpha 生成器

一个自动化工具,通过参数优化和回测来挖掘高质量的量化交易 Alpha 因子,并自动提交符合标准的因子。

weixin_37582383的博客 1万+

6、基于深度强化学习的无人机路径规划

本文研究了基于深度强化学习的无人机路径规划方法,提出了一种融合改进DQN算法与人工势场法的路径规划策略。通过设计合理的网络结构、状态空间、动作空间和奖励函数,结合ε-贪心策略进行动作选择,实现了无人机在复杂环境中的自主避障与目标导向飞行。仿真实验表明,该方法具有收敛速度快、实时性强和可操作性高等优点,能有效完成室内环境下的路径规划任务。文章还总结了算法优势,并对未来在连续动作、复杂环境适应及多无人机协同等方面的发展方向进行了展望。

web39explorer的博客 166

Java GoF 23种设计模式-创建型模式-单例模式(Singleton Pattern)

文章目录一、模式动机二、模式定义三、模式结构四、代码实现 一、模式动机 对于系统中的某些类来说,只有一个实例很重要,例如在计算机系统中,多线程中的线程池、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、ID(序号)生成器等常常被设计成单例。 在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在,这样的模式有几个好处: 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 有些类如ID(序号)

WU4566285的博客 339

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2100

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

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

Fatter$hday的博客 1150

飞牛fnNAS虚拟机标准安装

飞牛NAS是一款基于Debian开发的国产免费NAS系统,支持x86架构设备,可将闲置硬件改造为NAS服务器。系统安装简便,支持多种存储模式与硬盘休眠功能,具备智能影视管理、照片备份等实用功能,并提供多种远程访问方式。飞牛NAS还支持Docker扩展,目前已承诺永久免费。文章详细介绍了在VMware虚拟机中安装飞牛NAS的步骤,包括下载镜像、创建虚拟机、初始化设置等过程,并展示了创建共享文件夹等基本操作,帮助用户快速上手这款功能强大的免费NAS系统。

dgnankai的专栏 3261

喷涂机器人系列编程:ABB IRB 5500_(2).ABB IRB 5500喷涂机器人系统架构与组件

ABB IRB 5500喷涂机器人系统不仅在性能上表现出色,而且在安全和维护方面也提供了全面的解决方案。通过本文的详细介绍,希望读者能够更好地理解和掌握这一系统的架构和功能,为实际应用提供有力支持。

zhubeibei168的博客 779

java 设计模式:创建型模式::单例模式

单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一...

qq_42291606的博客 479

2026年北京君正数字IC笔试试卷带答案

本文摘要:该文档是一份数字IC设计相关的考试试题,包含单选题、多选题、波形分析题和代码设计题。内容涵盖时序约束、半导体工艺、状态机设计、逻辑综合、异步FIFO设计等知识点。试题解析详细,重点考察数字电路基础、时序分析和Verilog代码实现能力。典型题目包括多周期路径设置、Moore/Mealy状态机区别、同步复位与异步复位特性、RISC-V架构特点等,并提供了异步FIFO的Verilog实现参考代码。(149字)

Open 114

java 单例模式_初探Java设计模式1:创建型模式(工厂,单例等)

Java 设计模式转自https://javadoop.com/post/design-pattern系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star、fork哈文章也将发表在我的个人博客,阅读体验更佳:www.how2playlife.com本文...

weixin_39827625的博客 117

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java23种设计模式之创建型模式「单例模式」

单例模式 之 holder 模式 (推荐) /** * 单例模式 之 holder 模式 * 带有 Holder 的方法, * 类级内部类,静态的成员内部类,该内部类的实例与外部类的实例没有绑定关系 * 只有在调用的时候才会被封装,从而实现了延迟加载,即懒汉式 * * holder方式的单例模式是最好的设计之一,也是目前用的比价广泛的设计之一 * * 优点: * 将懒加载和线程安全完美结合的一种方式(无锁) * * 缺点: * * 注: * final 修

三分之二给你 的专栏 202

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Java 设计模式】创建型之单例模式

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点,使得这个实例可以被全局范围内的代码所访问。单例模式的主要目的是控制某个类的实例数量,确保在整个应用程序中只有一个实例存在。单例模式是一种常见且实用的设计模式,它可以确保在整个应用程序中只有一个实例存在。在选择懒汉式或饿汉式实现方式时,需要根据具体的需求和性能考虑来选择合适的方式。在实际开发中,单例模式通常用于管理共享资源、配置信息等全局唯一的对象。通过合理使用单例模式,可以提高系统的灵活性和可维护性。

好久不见的流星 1404

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java设计模式之单例模式【创建型】

大家好,我是爷爷的茶七里香,最近突然想做一个设计模式的系列,大家都知道设计模式有23种,而设计模式是由前人大量实践总结出来的,它是解决一些问题的最佳解决方案,我们今天就讲下单例模式中相对简单的单例模式吧。要实现单例模式要看以下几点: 测试: 打印结果:这种写法可以避免了性能的浪费也能做到线程安全,但是它并不是懒加载的,因为它是在项目启动就把对象创建好了,如果这个对象一直都用不到,那么就浪费内存了,这种写法用不用就看个人情况吧! 这种写法可以做到懒加载,但是如果是多线程的情况下会发生什么呢?可能

提笔忘字的帝国 696

Java设计模式之创建型模式——单例模式

关于单例模式中“饿汉式”的四种创建方式和“懒汉式”的两种创建方式详解,以及两种对单例模式的破坏方式及其解决办法

某位奇思妙想的IT人员 1146

【java设计模式】创建型模式介绍(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)

本文介绍Java设计模式中创建型模式的五种

Ez4Sterben的博客 1666

Java创建型设计模式——单例模式

本文主要是通过对Java单例模式的原理说明,并通过相关API带你了解Java单例模式的实现过程以及用途,希望对你有所帮助! 一句话说明:一个类只能创建一个对象,用于计数器,数据库连接池,读取配置文件等............

勇敢牛牛,不怕困难! 495

Java23种设计模式——1.创建型模式之单例模式

Java中除去有设计原则之外,还有23中设计模式。(设计模式我们主要来将思想和精髓的地方,除去Java还有其他的语言也可以适用) 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,这些设计模式可以解决一些特定的问题。 这些模式中,可以说是将语言的使用提现的淋漓尽致,我们今天要学习第一种设计模式,单例模式! 单例模式: 首先来说说什么叫单例模式。 我们参考官方的定义:(参考百度...

胖子胖子大胖子的博客 1342

java设计模式——创建型之单例模式

Singleton Pattern(单例模式)

Coding tortoise‘s JOY BOOKCASE~ 625

Java设计模式【单例模式】-创建型

单例模式(Singleton Pattern)是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。线程安全性:懒汉式单例模式需要考虑线程安全问题,可以通过加锁或者双重检查锁定来解决。延迟加载:懒汉式和静态内部类单例模式都支持延迟加载,即在需要时才创建实例。反序列化安全:如果单例类可能会被序列化和反序列化,需要注意保证反序列化后仍然是单例。多线程环境下的性能。

lianyinghhh的博客 486

java设计模式(二):创建型设计模式之单例模式

一、创建型模式的特点和分类 创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。 创建型模式分为以下几种。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型,通过对其进行复

qq_34721505的博客 199

【Java设计模式】创建型设计模式-单例模式(二)

单例模式适用于需要频繁创建和销毁且消耗时间较长,耗费资源过多,但又是频繁使用的对象(重量级对象)。例如:工具类对象、web开发中的必须用到的对象(servlet对象)、用于操作数据库和文件的对象(数据源对象、session工厂对象等)

古采尼的博客 865

Java设计模式之创建型:单例模式

单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能。可以严格控制客户怎么样以及何时访问单例对象。

张维鹏的博客 2万+
上一篇: Gradle将项目lib下的jar联合项目达成新的jar
下一篇: tomcat部署WebSocket服务,初始化ServerEndPointExporter失败问题
Concsdn
博客等级 码龄9年 25粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值