设计模型之单例设计

news2024/11/15 10:37:48

前言

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:1.单例类只能有一个类。2单例类必须创建自己的唯一id.

  • 3、单例类必须给所有其他对象提供这一实例。

单例模式的实现

单例设计模式分为两种:

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

懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会被创建。

饿汉式实现方式一:静态变量方式

public class Singleton {

    //私有构造方法
    private Singleton(){

    }
    //2.在本类中创建本类对象
    private static  Singleton instance=new Singleton();

    //3.提供一个公共的访问方法,让外界获取该对象
    public static Singleton getInstance(){
        return instance;
    }
}
public class Main {
    public static void main(String[] args) {
        //创建Singleton类的对象
       Singleton instance= Singleton.getInstance();
       Singleton instance1= Singleton.getInstance();

        System.out.println(instance==instance1);
    }
}

 饿汉式实现方式二:静态代码块

public class Singleton {
    //1.私有构造方法,防止被外界创建
    private Singleton(){};

    //声明Singleton类型的变量
    private  static  Singleton instance;//null
    //在静态代码块中进行赋值
    static {
        instance=new Singleton();
    }
    //对外界提供获取该类对象的方法
    public static Singleton getInstance(){
        return instance;
    }


}
public class Main {

    public static void main(String[] args) {
        //创建Singleton类的对象
         Singleton instance= Singleton.getInstance();
         Singleton instance1= Singleton.getInstance();

        System.out.println(instance==instance1);
    }
}

 

  饿汉式实现方式三:枚举

public enum Singleton {
    INSTANCE;
}
public class Main {


    public static void main(String[] args) {
        //创建Singleton类的对象
       Singleton instance= Singleton.INSTANCE;
      Singleton instance1= Singleton.INSTANCE;

        System.out.println(instance==instance1);
    }

}

 

懒汉式实现方法一:(线程不安全)

public class Singleton {

    //1.私有构造方法,防止被外界创建
    private Singleton(){};

    //声明Singleton类型的变量,并没有进行赋值
    private  static Singleton instance;//null

    //对外界提供获取该类对象的方法
    public static Singleton getInstance(){
        if(instance==null)
        {
            instance=new Singleton();
        }

        return instance;
    }


}

但是这种方法在多线程里是不安全的,当有两个线程时,一个线程执行到判断语句判断instance是否为null时,处于等待状态,而另一个线程获得CPU的执行权,也会进行判断里面,这时会创建两个Singleton对象。

懒汉式实现方法二:加入synchronized 

public class Singleton {

    //1.私有构造方法,防止被外界创建
    private Singleton(){};

    //声明Singleton类型的变量,并没有进行赋值
    private  static Singleton instance;//null

    //对外界提供获取该类对象的方法
    public static synchronized Singleton getInstance(){
        if(instance==null)
        {
            instance=new Singleton();
        }

        return instance;
    }


}

 懒汉式实现方法三:双重检查方式

public class Singleton {

    //1.私有构造方法,防止被外界创建
    private Singleton(){};

    //声明Singleton类型的变量,并没有进行赋值
    private  static Singleton instance;//null

    //对外界提供获取该类对象的方法
    public static Singleton getInstance(){
        //第一次判断,如果instance的值不为null,不需要抢占锁,直接返回对象
        if(instance==null)
        {
            synchronized (Singleton.class){
                //第二次判断
                if(instance==null)
                {
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

双重检查锁模式的优缺点:缺点:可能会出现空指针问题。解决方法:使用volatile关键字。 volatile保证可见性和有序性。

 懒汉式实现方法四:静态内部类方式

public class Singleton {

    //1.私有构造方法,防止被外界创建
    private Singleton(){};

    //定义一个静态内部类
    private  static class SingletonHolder{
        //在内部类中声明并初始化内部类的对象
        private  static final Singleton INSTANCE=new Singleton();
    }

    //对外界提供获取该类对象的方法
    public static Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

 静态内部类是一种优秀的单例模式,比较常用,在没有加锁的情况下,保证了多线程下的安全,并且没有任何性能影响和空间的浪费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3. Exchange 交换机的使用

二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。 在上一节中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消 费者(工作进程)。在这一部分中,我们将做一些完全不同的…

孪生神经网络

孪生神经网络 孪生神经网络(Siamese network)主要用途是比较两图片的相似程度,其核心思想就是权值共享。 卷积神将网络是通过卷积运算提取图像的特征进行训练的,如果想比较两个图像的相似程度,也要对两个图像分别进行…

毛里智慧小学宿舍楼工程量清单编制

目 录 摘 要 I 第1章 前言 1 第2章 招标控制价编制 3 2.1招标控制价 3 2.2建设项目招标控制价汇总表 4 2.3单项工程招标控制价汇总表 5 2.4单项工程招标控制价汇总表 14 2.5分部分项工程和单价措施项目清单与计价表 24 2.6总价措施项目清单与计价表 27 2.7综合单价分析表 28 2.…

C语言学习之路(基础篇)—— 文件操作(上)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 概述 1) 磁盘文件和设备文件 磁盘文件 指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。 设备文件 在操作…

亚马逊云科技re:Invent:Serverless是所有构想的核心

12月2日,2022亚马逊云科技re:Invent全球大会上,Amazon.com副总裁兼首席技术官Werner Vogels博士向开发者们展示了另一种可能。在一系列Serverless工具的帮助下,一些代码可以少写,因为未来你可能再也不需要写它们了。这恐怕是自云原…

包装类-Wrapper

包装类的分类 针对八种基本数据类型相应的引用类型-包装类有了类的特点,就可以调用对应的类中的方法 装箱和拆箱 Java是一种面向对象的编程语言,学习Java时就被明确灌输了一个概念:OOP,即面向对象编程。一切皆对象。但是基本…

[附源码]JAVA毕业设计框架的电脑测评系统(系统+LW)

[附源码]JAVA毕业设计框架的电脑测评系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技…

Win11右键菜单反应慢有延迟解决方法分享

Win11右键菜单反应慢有延迟解决方法分享。有用户发现电脑鼠标点击右键菜单的时候,会出现一些延迟,导致自己在使用的过程中非常难受。那么这个问题如何自己去进行解决呢?我们一起来看看详细的解决方法分享吧。 解决方法: 注意&…

物联网IoT体系结构及核心技术

物联网,英文名为Internet of things(IoT),顾名思义,物联网就是物物相连的互联网。 这有两层意思: 1、物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络; 2、从…

超级详细 的 Redis 安装教程

超级详细 的 Redis 安装教程 Windows 版本的 Redis 是 Microsoft 的开源部门提供的 Redis. 这个版本的 Redis 适合开发人员学习使用,生产环境中使用 Linux 系统上的 Redis, 这里讲解了这两种的安装和下载。按照你们需要的liunx 或window步骤来 就可以了(…

智能优化算法:法医调查优化算法 - 附代码

智能优化算法:法医调查优化算法 摘要:法医调查优化算法( Forensic-based investigation algorithm, FBI), 是由 Jui-Sheng Chou 等于2020 年提出的一种群体智能优化算法。其灵感来源于警官调查嫌疑人的过程。 1.法医调查优化算法 警察的大规模案件调查…

Java并发编程—线程详解

文章目录线程简介什么是线程多线程的使用什么时候需要使用多线程?写多少个线程比较合适?线程优先级靠谱的让出CPU的方法?线程的状态线程的状态有哪几种?线程的状态转换Daemon线程启动和终止线程构造线程启动线程理解中断如何安全的…

[附源码]计算机毕业设计基于Springboot的物品交换平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

逻辑回归模型和Python代码实现

文章目录逻辑回归原理sigmoid函数优化建模代码实现自编代码sklearn代码代码测试原理测试交叉验证逻辑回归原理 此前介绍的线性回归基本模型和增加了正则项的优化模型都只能用来预测连续值(标签值是多少),如果想要应用于分类问题(…

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出 文章目录 回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出预测效果基本介绍模型结构程序设计参考资料致谢预测效果 基本介绍 GRU神经网络是LSTM神经网络的一种变体,LSTM 神经网 络是在RNN的基础上发展起来的。RNN是一…

Python学习----网络编程

网络:网络就是实现资源共享和信息传递的虚拟平台,我们可以编写基于网络通信的程序。比如socket编程,web开发 Socket编程 Socket是程序之间通信的一个工具,好比显示生活中的电话,你知道了对方的电话号码之后&#xff…

RabbitMQ进阶

可以结合着狂神的RabbitMQ的笔记来进行学习 狂神说RabbitMQ笔记 RabbitMQ高级特性 消息可靠性投递 保证我发出的消息可以到达中间件,避免在传输的过程中发生丢失的情况。 这两个可靠性传输方式分别是负责不同的阶段,confirm是负责保证从生产者到队列…

[附源码]Python计算机毕业设计Django抗疫医疗用品销售平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

2023年江苏省职业院校技能大赛中职赛项规程样题

2023年江苏省职业院校技能大赛中职赛项规程 一、赛项名称 赛项编号:JSZ202335 赛项名称:网络安全 赛项组别:学生组、教师组 赛项归属专业大类:信息技术类 竞赛目的 贯彻落实《国家职业教育改革实施方案》《关于推动现代职业教…

设计模式——观察者模式

动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖…