多线程-单例模式

目录

1.单例模式

举例:

 1.1单例模式的实现

饿汉模式:

懒汉模式: 


1.单例模式

       单例模式是一种设计模式。单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例.

举例:

package 多线程;

import javax.management.MBeanAttributeInfo;
//就期望这个线程只有一个实例
class Singleton{
    private static Singleton instance = new Singleton();//类一被启动就会初始化这个静态成员,实例创建的非常早

    public static Singleton getInstance(){
        return instance;
    }

    private Singleton(){}
}

public class ThreadDemo21 {
    public static void main(String[] args) {
        Singleton s = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s == s2);
    }
}

       私有的构造函数确保其他类无法通过直接实例化来创建 Singleton 的对象。而静态的 instance 成员变量在类加载时就被初始化,因此在整个程序中只会有一个 Singleton 的实例。我们用getInstance方法获取到实例,并赋值给s和s2,最后我们通过比较发现是同一个实例所以会输出true。

      

 1.1单例模式的实现

        单例模式具体的实现⽅式有很多. 最常⻅的是 "饿汉" 和 "懒汉" 两种. 

饿汉模式:

        我们上面的例子就是一个饿汉模式的例子,他的特点就是成员变量在被类加载的时候就被初始化了。优点是实现简单,线程安全,缺点是无法延迟实例化,可能会造成资源浪费。

package 多线程;

import javax.management.MBeanAttributeInfo;
//就期望这个线程只有一个实例
class Singleton{
    private static Singleton instance = new Singleton();//类一被启动就会初始化这个静态成员,实例创建的非常早

    public static Singleton getInstance(){
        return instance;
    }

    private Singleton(){}
}

public class ThreadDemo21 {
    public static void main(String[] args) {
        Singleton s = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s == s2);
    }
}

懒汉模式: 

        懒汉模式是一种常见的单例模式实现方式,它的特点是在第一次使用时才会创建单例实例。这样可以避免在程序启动时就创建对象,从而节省资源。

举例:

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

        当我们第一次调用getInstance方法的时候就是第一次使用单例实例。但是这个代码如果在多线程是不安全的,因为当多个线程同时调用 getInstance() 方法时,都发现 instance 为 null,则会同时创建多个实例,导致不符合单例模式的要求。所以我们可以加上synchronizied关键字。

代码如下:

package 多线程;

//懒汉的方式实现单例模式
class SingletonLazy{
    //引用指向唯一实例,这个引用先初始化位null,而不是立即创建实例
    private volatile static SingletonLazy instance =null;
    private static Object locker = new Object();

    public static SingletonLazy getInstance(){//如果首次调用getInstance,那么instance引用为null就会进入if条件,把实例创建出来
        if(instance == null){
            synchronized (locker){
                if (instance == null){
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
}

public class ThreadDemo22 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1 == s2);

    }
}

   这样我们的代码就不会出现安全问题。最后也会输出true。

                                                              希望大家多多支持! 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django从入门到精通(三)

目录 七、ORM操作 7.1、表结构 常见字段 参数 示例 7.2、表关系 一对多 多对多 第一种方式 第二种方式 7.3、连接MYSQL 7.4、数据库连接池 7.5、多数据库 读写分离 分库(多个app ->多数据库) 分库(单app) 注意…

微服务入门篇:Eureka注册中心(作用,搭建Eureka客户端和服务端)

目录 1.提供者与消费者2.Eureka的作用3.搭建EurekaServer1.配置服务端2.配置客户端3.复制实例操作4.服务拉取 1.提供者与消费者 ①服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) ②服务消费者:一次业务中,调用其它微…

【机器学习】全网最全模型评价指标(性能指标、YOLOv5训练结果分析、轻量化指标、混淆矩阵详解)【基础收藏】

🥑 Welcome to Aedream同学 s blog! 🥑 文章目录 模型性能指标常见指标ROC/AUCROC & PRC多分类问题——混淆矩阵 计算结果分析——以YOLO v5为例1. confusion_matrix.png(混淆矩阵)2. F1_curve:3. labels.jpg4. labels_corrrelogram.jpg5…

【unity实战】实现蓄力丢手榴弹、烟雾弹、燃烧弹的效果

文章目录 爆炸燃烧烟雾效果资产手榴弹丢手雷烟雾弹、燃烧弹实现手雷每次撞墙弹发出音效(补充)完结 爆炸燃烧烟雾效果资产 https://assetstore.unity.com/packages/vfx/particles/war-fx-5669 手榴弹 手榴弹配置好刚体,碰撞体 新增脚本Th…

Dify学习笔记-工具(七)

1、工具 工具定义 工具可以扩展 LLM 的能力,比如联网搜索、科学计算或绘制图片,赋予并增强了 LLM 连接外部世界的能力。Dify 提供了两种工具类型:第一方工具和自定义工具。 你可以直接使用 Dify 生态提供的第一方内置工具,或者轻…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下,拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案,助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

广州市荔湾区区长谭明鹤、广州工控副总经理张劲泉一行莅临上海毅速考察交流

2024年1月23日,广州市荔湾区区长谭明鹤、副区长阮伟致、广州工业投资控股集团有限公司(简称:广州工控)副总经理张劲泉等一行来到毅速公司上海总部考察交流。毅速公司董事长张占波、总经理陈烨、常务副总经理王利军等亲切接待了考察…

Sublime Text 3配置 Java 开发环境

《开发工具系列》 《开发语言-Java》 Sublime Text 3配置 Java 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 Java3. 接入 Java3.1 JDK 下载3.2 安装和使用 java3.3 环境变量配置 4. 配置 Java 开发环境5. 编写 Java 代码6. 编译和运行 Java 代码7. 乱码问题 三…

智能体AI Agent的极速入门:从ReAct到AutoGPT、QwenAgent、XAgent

前言 如这两天在微博上所说,除了已经在七月官网上线的AIGC模特生成系统外,我正在并行带多个项目组 第二项目组,论文审稿GPT第2版的效果已经超过了GPT4,详见《七月论文审稿GPT第2版:用一万多条paper-review数据集微调…

Confluence 的文章导入到 YouTrack KB 中

YouTrack 是有一个 KB 的,我们可以吧 Confluence 的文章全部导入到 YouTrack 的 KB 中。 首先,你需要具有管理员权限,然后选择导入。 然后可以在打开的界面中新增一个导入。 在新增导入中输入 Confluence 在随后的界面中输入你 Confluence …

OpenCV书签 #差值哈希算法的原理与相似图片搜索实验

1. 介绍 差值哈希算法(Difference Hash Algorithm,简称dHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片的搜索工作。 2. 原理 差值哈希算法通过计算相邻像素的差异来生成哈希,即通过缩小图像的每个像素与平…

关于IDEA中sout、fori无法自动生成的解决方案

方案一.通过idea中的设置修改 搜索栏搜索sout 点击change,全部勾选Java下的选项 最后别忘了点击右下角的Apply 方案二:写main函数 不能直接在类里生成,需要写一个main函数。(我就是忘了写main函数才无法生成的。&#xff09…

Soul CEO张璐积极履行反诈责任,倡导共建安全网络

近期,备受期待的反诈电影《鹦鹉杀》热映,深入剖析杀猪盘这一网络诈骗行为。为协助更多人增强反诈意识,备受欢迎的社交应用Soul App积极响应,在Soul CEO张璐的带领下,邀请电影中的演员和平台的反诈中心共同参与反诈宣传。此外,一旦用户在平台搜索“诈骗”、“杀猪盘”、“鹦鹉杀…

Spring Boot3整合MyBatis Plus

目录 1.前置条件 2.导坐标 3.配置数据源 4.mybatis-plus基础配置 5.配置mapper扫描路径 6.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 7.整合Druid连接池 1.前置条件 已经初始化好一个spring boot项目且版本为3X,项目可正常启动 初始化教程…

Halcon指定区域的形状匹配

Halcon指定区域的形状匹配 文章目录 Halcon指定区域的形状匹配1.在参考图像中选择目标2.创建模板3.搜索目标 在这个实例中,会介绍如何根据选定的ROI选择合适的图像金字塔参数,创建包含这个区域的形状模板,并进行精确的基于形状模板的匹配。最…

echarts-wordcloud词云

echarts-wordcloud是基于echarts的一个插件,所以我们要首先安装echarts包,然后再安装echarts-wordcloud的包,这里我的练习项目安装的版本;当然,你可以随意安装你需要的版本; “echarts”: “^5.3.3”, “ec…

PCB制板基础知识

一、PCB概念 PCB(PrintedCircuitBoard),中文名称为印制电路板,又称印刷电路板、印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气连接的提供者。由于它是采用电子印刷术制作…

前端工程化基础(一):Node模块化

Node模块化 Node.js是什么 官方定义:Node.js是一个基于V8 JavaScript引擎的JavaScript运行时的环境 Node.js基于V8引擎来执行 JavaScript代码,但是Node.js中不仅仅有V8 我们知道,V8可以嵌入到C应用程序中,因此无论是Chrome还是No…

Redis快的秘密,高性能设计epoll和IO多路复用探究

Redis快的原因,高性能设计epoll和IO多路复用探究 1、多路复用需要解决的问题 并发多客户端连接,在多路复用之前最简单和典型的方案:同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接(即一个用户请求&#x…

windows 下docker-compose 试玩 paperlsess

第一步安装:(假设docker-compose已安装好) 下载 docker-compose.yml ,docker-compose.env: github下载地址 在docker-paperless.env增加环境变量,设置管理员账户信息: PAPERLESS_ADMIN_USER: admin PAPERLESS_ADMIN_P…
最新文章