QQ153194574 2018-10-19 10:00 采纳率: 100%
浏览 1512
已采纳

请问在java单例设计模式中,为什么要private static对象的时候不直接new出来?

请问单例设计模式为什么采用第一种方法,不采用第二种方法?谢谢!

第一种,一般采用的方法
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance(){
if (instance ==null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}

第二种,我自己的方法
public class Singleton {
private static Singleton instance = new Singleton();

private Singleton() {
}
public static Singleton getInstance(){
    return instance;
}

}

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-10-19 10:10
    关注

    第一种方法是懒惰加载,节约了一点点内存和运算时间(取决于构造函数做了什么),然而在早期,jvm的设计有bug,在多cpu上,两次instance ==null,或者叫做double check lock(dcl)的办法,不能保证多线程的安全性,甚至造成死锁。所以那时候会推荐在并发环境下,用后面的写法。

    现在的jvm没有那个问题,cpu和内存也不再那么值钱,所以现在很少有人纠结了,两个办法都可以。

    延伸阅读:https://www.javaworld.com/article/2074979/java-concurrency/double-checked-locking--clever--but-broken.html (可能需要科学上网)
    https://blog.csdn.net/chenchaofuck1/article/details/51702129

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵