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中的单例模式。惰性初始化 的相关文章

随机推荐

  • 服务器如何处理来自多个客户端的 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