java中的单例模式。惰性初始化

2023-11-27

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

1.上面的getInstance方法的实现有缺陷吗? 2.两种实现有什么区别?

public static synchronized MySingleton getInstance() { 
 if (_instance==null) {
  _instance = new MySingleton();
 }

 return _instance;
} 

我在 stackoverflow 中看到了很多关于单例模式的答案,但我发布的问题是要了解在这种特殊情况下方法和块级别的“同步”的主要区别。


1.上面的getInstance实现有缺陷吗 方法?

这是行不通的。您最终可能会得到多个 Singleton 实例。

2.两种实现有什么区别?

第二个可以工作,但需要同步,当您从不同线程对该方法进行大量访问时,这可能会减慢系统速度。

最直接的正确实现:

public class MySingleton{
    private static final MySingleton _instance = new MySingleton();
    private MySingleton(){}
    public static MySingleton getInstance() { 
        return _instance;
    }
}

更短更好(安全序列化):

public enum MySingleton{
    INSTANCE;

    // methods go here
}

单例的延迟初始化是一个备受关注的话题way与它的实际实用性不成比例(IMO 争论双重检查锁定的复杂性,你的例子是第一步,只不过是一场令人生气的比赛)。

在 99% 的情况下,你根本不需要延迟初始化,或者 Java 的“类首次引用时初始化”就足够了。在剩下的 1% 的情况下,这是最好的解决方案:

public enum MySingleton{
    private MySingleton(){}
    private static class Holder {
         static final MySingleton instance = new MySingleton();
    }
    static MySingleton getInstance() { return Holder.instance; }
}

See 按需初始化持有者习惯用法

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

java中的单例模式。惰性初始化 的相关文章

  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 使用 volatile bool 强制另一个线程等待是否安全? (C++)

    我读到的有关 volatile 的所有内容都说它永远不安全 但我仍然倾向于尝试它 而且我还没有看到这种特定场景被宣布为不安全 我有一个单独的线程来渲染场景 从主模拟线程中提取数据 这没有同步 并且工作正常 问题是 当程序退出时 渲染器需要停
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 如何将 XMP XML 块序列化为现有的 JPEG 图像?

    我有许多 JPEG 图像 其中包含损坏的 XMP XML 块 我可以轻松修复这些块 但我不确定如何将 固定 数据写回图像文件 我目前正在使用 JAVA 但我愿意接受任何能让这项任务变得容易的事情 这是目标关于 XMP XML 的另一个问题
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 服务器如何处理来自多个客户端的 Web 服务请求

    我刚刚完成了一个 Android 应用程序 它使用 Web 服务连接到远程数据库 我在本地主机上工作 现在 我计划在服务器上托管我的 Web 服务 假设我的 Android 应用程序安装在任意数量的不同客户端智能手机上 每个智能手机用户同时
  • 以节省内存的方式增长 data.frame

    根据逐行创建 R 数据框 附加到 a 并不理想data frame using rbind 因为它每次都会创建整个 data frame 的副本 我如何积累数据R导致data frame而不受到这种处罚 中间格式不需要是data frame
  • 一般来说,解引用指针表达式结果是引用类型吗?

    引用指针会导致间接使用对象的值 但我从来没有真正理解 使用 是什么意思 我开始思考这个问题 直到我的编译器对以下代码产生错误 int i 0 pi i decltype pi c error c declared as reference
  • 快速更改 UINavigationBar 中 UIBarButtonItem 的宽度

    我需要在 swift 2 0 中为导航栏按钮设置框架 我试过这个代码 self navigationController navigationBar drawRect CGRectMake 0 0 30 30 但这行不通 提前致谢 Swif
  • Java中可以写swap方法吗? [复制]

    这个问题在这里已经有答案了 问题是 编写一个交换两个变量的方法 这两个变量应该是原语 它不需要是通用的 例如二int变量 有办法吗 虽然不可能编写一个简单地交换两个变量的函数 但可以编写一个辅助函数这使您能够 使用交换两个变量只有一个声明
  • 成员函数隐藏自由函数

    void foo int class X void foo void bar foo 42 error no matching function for call to X foo int note candidate is note vo
  • 为什么“object”是“type”的实例,而“type”是“object”的实例?

    我有点困惑object and typePython 3 中的类 也许有人可以消除我的困惑或提供一些额外的信息 我目前的理解是每个班级 除了object 继承自一个名为的基类object 但每堂课 包括object 也是该类的一个实例typ
  • 如何使用 jquery 或 JavaScript 在一次浏览中上传多个文件

    我正在开发一个网络应用程序 其中我为多个文件创建了一个页面 一次上传一个浏览文件 而不是一次上传一个文件 用户将能够通过单击浏览来选择多个文件 如果有人对此有解决方案 欢迎 Thanks 对于替代解决方案 您可以使用 HTML5 多重上传
  • android 的事件监听器是如何工作的?

    如何从 View 对象捕获事件 只有一个线程在运行 UI 线程 当我们没有实现任何我们自己的线程时 假设我已经为按钮实现了 onClickListener 并且该按钮的功能是 取消 对于由按钮引发的事件 即取消 UI 正在执行的任何操作 它
  • 如何保存控制台应用程序的输出

    我需要有关如何让我的 C 控制台应用程序通过标准输出向用户显示文本 同时仍然能够稍后访问它的建议 我想要实现的实际功能是在程序执行结束时将整个输出缓冲区转储到文本文件中 当我找不到更干净的方法时 我使用的解决方法是子类化TextWriter
  • 格式化 linq 查询结果中的日期

    以下 linq toEntity 查询给出以下结果 public class UserCountResult public DateTime date get set should this be string instead public
  • Python检测linux关机并在关机前运行命令

    是否可以检测并中断 linux Ubuntu 16 04 关闭信号 例如单击电源按钮或电池耗尽 我有一个总是录制视频的Python应用程序 我想检测这样的信号 所以我在操作系统关闭之前正确关闭录制 当linux关闭时 所有进程都会收到SIG
  • Eclipse 动态 Web 项目 - 默认起始页

    我在 Eclipse 中创建了动态 Web 项目 WEB INF 文件夹中有index html 我点击项目主文件夹 Run as gt Run on server 选择 Tomcat v7 0 完成 运行正常 但是 当我将 index h
  • 为什么没有 OutOfMemoryError 子类?

    众所周知 造成这种情况的原因是多方面的OutOfMEmoryError see 第一个答案 为什么只有一个异常涵盖所有这些情况 而不是继承自的多个细粒度异常OutOfMEmoryError 我预料到了 因为当这种情况发生时 你真的无能为力
  • constexpr 问题,为什么这两个不同的程序使用 g++ 运行的时间如此不同?

    我正在使用 gcc 4 6 1 并且得到一些有趣的行为 涉及调用constexpr功能 这个程序运行得很好并且立即打印出来12200160415121876738 include
  • 如何在 Java 中以编程方式启动和停止 Amazon EC2 实例

    如何启动和停止亚马逊EC2在java中以编程方式使用aws sdk实例 非常感谢任何帮助 因为我花了一天时间试图解决这个问题 我最近在Bamboo AWS 插件 它是开源的并且代码可在 Bitbucket 上找到 您可以找到如何启动 停止
  • 异步 NSURLConnection 抛出 EXC_BAD_ACCESS

    我不太确定为什么我的代码抛出 EXC BAD ACCESS 我遵循了 Apple 文档中的指南 void getMessages NSString stream NSString myURL NSString stringWithForma
  • matplotlib 循环为每个类别绘制子图

    我正在尝试编写一个循环 该循环将生成一个包含 25 个子图的图形 每个国家 1 个子图 我的代码制作了一个包含 25 个子图的图形 但这些图是空的 我可以更改什么以使数据出现在图表中 fig plt figure for c num in
  • std::sort 使用自定义比较器

    在下面的代码中 为什么这三个IntComparator IntComparator2 and IntComparator3作为第三个参数sort 功能 他们不会有不同的左值函数类型吗 基于https en cppreference com
  • java中的单例模式。惰性初始化

    public static MySingleton getInstance if instance null synchronized MySingleton class instance new MySingleton return in