创建型模式 - 单例模式

2023-10-30

在这里插入图片描述

核心

严谨起见,私有构造必须要加,避免外部创建新的实例

特性

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

常用的几种单例模式写法

  1. 懒汉方式
  2. 双重锁方式
  3. 静态类方式

每种方式对应的特性

方式				线程是否安全

懒汉方式			不安全

双重锁方式		安全(同步锁)

静态类方式		安全(静态类)
懒汉方式
 private static SingleInstance singleInstance;

    private SingleInstance (){}

    public static SingleInstance getInstance(){
        if (singleInstance == null) {
            singleInstance = new SingleInstance();
        }
        return singleInstance;
    }

线程不安全,如果多线程第二种比较合适

双重锁方式

    private volatile static SingleInstance singleInstance;

    private SingleInstance (){}

    public static SingleInstance getInstance(){
        if (singleInstance == null) {
            synchronized (SingleInstance.class) {
                if (singleInstance == null) {
                    singleInstance = new SingleInstance();
                }
            }
        }
        return singleInstance;
    }

这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
因为这里用到了了volatilesynchronized

静态类方式

    public static SingleInstance getInstance() {
        return SingleInstanceS.INSTANCE;
    }
    

    private static class SingleInstanceS {
        private static SingleInstance INSTANCE = new SingleInstance();
    }

静态类方式 只有在要明确实现 lazy loading 效果时,才比较适合

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建型模式 - 单例模式 的相关文章

  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • 在Ubuntu上使用NFS挂载

    假设要把192 16 2 101服务器上的 home sharedata 挂载到192 16 2 102服务器上的 home receive data 一 服务端 1 安装NFS服务端 sudo apt get install nfs ke
  • 结合分析和数值技术 Python 在基本力学应用

    特点 展示了如何将分析方法和数值方法无缝集成来解决物理问题 内容 介绍 开始编程 单位和测量 一维运动 一维力 二维和三维运动 二维和三维力 受限运动 力和约束运动 工作能量 动量 脉冲和碰撞 多粒子系统 旋转运动 刚体的旋转 刚体动力学
  • java aop拦截器

    可在切面代码修改为数据库获取或redis中获取 依赖
  • 大数据平台搭建及搭建过程出错解析

    1 安装第一台虚拟机 参照博主文章 连接如下 https blog csdn net weixin 46457946 article details 114758813 2 配置网卡 配置网卡前看看你的ifconfig命令能不能用 一般来说
  • go详解strings包

    Count 计算字符串 sep 在 s 中的非重叠个数 如果 sep 为空字符串 则返回 s 中的字符 非字节 个数 1 使用 Rabin Karp 算法实现 html view plain copy func Count s sep st
  • 【Java开发者专场】阿里专家杜万:Java响应式编程,一文全面解读 ...

    本篇文章来自于2018年12月22日举办的 阿里云栖开发者沙龙 Java技术专场 杜万专家是该专场第四位演讲的嘉宾 本篇文章是根据杜万专家在 阿里云栖开发者沙龙 Java技术专场 的演讲视频以及PPT整理而成 摘要 响应式宣言如何解读 Ja
  • 【Linux】利用消息队列实现一个简单的进程间双向通信(两种方式)

    在实现利用消息队列的进程间通信之前 先了解一下基本的概念和所需要用到的函数 消息队列 消息队列是Linux内核地址空间中的内部链表 各个进程可以通过它来进行消息传递 进程发送的消息会顺序写入消息队列之中 且每个消息队列都有IPC标识符唯一地
  • C# 采用Basic Auth传递Post或者GET 数据

    public class JiraApi private string m Username private string m Password public JiraApi string username string password
  • c++实现置换选择排序有序子序列

    1 输入数据个数 2 输入每个数据 3 输入内存大小 4 输出有序序列
  • HTML中四种选择器

    1 类选择器class class 2 id 选择器 id 3 派生选择器 p strong 4 属性选择器 title title te 代码如下 p strong 派生选择器 strong p li strong Hello 派生选 s
  • Python数据结构与算法分析 第四章 递归 贪心 动态规划bp 记忆化搜索

    递归算法也总结出 三定律 1 递归算法必须有一个基本结束条件 最小规模问题的直接解决 2 递归算法必须能改变状态向基本结束条件演 进 减小问题规模 3 递归算法必须调用自身 解决减小了规模的相同问题 10进制转16 递归实现 def to1
  • ray tracing of Embree

    GitHub embree embree Embree ray tracing kernels repository Intel Embree is a collection of high performance ray tracing
  • QCM2290平台XBL阶段配置I2C

    1 修改QcomPkg SocPkg AgattiPkg Settings I2C core i2c devcfg c CONFIGURATION START define TOP QUP 00 SDA TLMM GPIO CFG 0 1
  • Pandas Dataframe按照给定的index列表切分成多个小Dataframe

    整个思路比较简单 根据dataframe loc 来框一个子dataframe 由于 loc 是左闭右闭 所以如果希望哪一边开的话 需要删除哪一边的数据 使用的工具函数如下 def split dataframe by index list
  • RAII机制

    RAII机制介绍 RAII Resource Acquisition Is Initialization 是由c 之父Bjarne Stroustrup提出的 中文翻译为资源获取即初始化 他说 使用局部对象来管理资源的技术称为资源获取即初始
  • unity制作UI显示

    unity制作UI显示 创建Canvas 在Hierarchy中 右键UI gt Image 配置 在Inspector中配置 Render Mode Screen Space Overlay 勾选Pixel Perfect Canvas
  • IIS配置反向代理

    访问路径作为条件匹配 入站规则 配置模式 upload 配置url 重写 http localhost 9000 R 2 以域名为条件匹配 入站匹配规则 任意 条件 添加 HTTP HOST 选择与模式匹配 模式正则 www abc com
  • 6个高级Python技巧

    前言 Python是一种面向对象的语言 它与英语非常相似 因此对于初学者来说是一种非常好的语言 它的高级特性和受支持的库包甚至可以用几行代码来编写复杂的任务 在本文中 我们将介绍python的一些高级特性 掌握这些特性可以让你的编程更加顺畅
  • Linux: android studio AVD emulator启动不了

    前置条件 目前我台式机电脑的情况是 OS Slackware Linux 14 1显卡 NVidia 独立显卡 用于 GPU计算 Intel i3 集成显卡 用于连接 43寸液晶显示器 今天安装当前最新版本的 android studio
  • 创建型模式 - 单例模式

    核心 严谨起见 私有构造必须要加 避免外部创建新的实例 特性 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 常用的几种单例模式写法 懒汉方式 双重锁方式 静态类方式 每种方式对应的特性 方式