android18 2010-12-23 10:22
浏览 186
已采纳

关于 单例 模式的一些疑惑

最近在看 headfirst 在 singleton这里我有些问题。。想请教 javaeye 的朋友

贴代码:


public class MyClass {
private static MyClass uniqueInstance;

private MyClass(){}
    public static synchronized MyClass getInstance(){
    if(uniqueInstance == null){
        return new MyClass();
    }
    return uniqueInstance;
}


这里 是使用 同步来保证线程安全。。但是 headfirst解释说 这样会让效率 下降100 倍(对于一个大的系统来说这应该算是一个很大的问题了)
但是 我不知道 哪个地方会是 系统 效率下降 希望 朋友梦帮忙解惑!

2 再看第二种

public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {
}

public static Singleton getInstance() {
    return uniqueInstance;
}

}


headfirst说 这是急切 实例化 他解决了 第一中方式的 线程安全问题 而且 也考虑到了效率

但是 这么 做的前提 headfirst给出提说 系统“在创建和运行时方面的 负担不太繁重,你可能想要急切创建此单件 ”
我想知道 何为“在创建和运行时方面的 负担不太繁重” 什么 情况下算是 “在创建和运行时方面的 负担繁重?”

这是第二个问题

3 第三个 问题

public class SingletonTest {
private volatile static SingletonTest uniqueInstance;
private SingletonTest(){}
public static SingletonTest getInstance(){
    if(uniqueInstance == null){
        synchronized(SingletonTest.class){
            if(uniqueInstance==null){
                uniqueInstance = new SingletonTest();
            }
        }
    }
    return uniqueInstance;
}

}


headfirst解释说利用双重检查  加锁 。。首先检查时候实例已经创建了 如果未创建 ,”才“进行同步区,这样只有第一次会同步,

问题来了 。。这样做就不会造成效率问题么??。。

麻烦 那位 能详细的说说。。我细看了 但是看得不是很清楚。。。。。






问题补充
chenyongxin 写道
个人愚见,不对请拍砖:
第一种,因为同步,串行处理,在高并发的时候,影响效率。
第二种,解决了效率也解决了线程安全问题。
第三种,在多线程高并发的时候第一次访问也存在效率问题,比如第一次同时有100人访问, 第一个if(uniqueInstance == null),最坏情况会有100人if里面,synchronized(SingletonTest.class)同步产生串行处理。第101人访问的时候才能体现出效果。
我认为还是第二种比较好,第三种吗也挺好,还是看使用场景,如果是类似秒杀的情况用第二种,如果不是秒杀,系统又需要延迟加载(或者使用的时候在加载)用第三种。

但是。。。针对第二种情况  我有些不明白什么 叫 ”在创建和运行时方面的 负担繁重“。。。。。

说真的。。我对这个概念很模糊。。。能解释一下么???
  • 写回答

8条回答 默认 最新

  • chenxiang105 2010-12-23 12:57
    关注

    性能主要解决之处想到 减少对象创建 减少处理时间(减少同步)
    使用同步 处理就是代码中多了很多判断 一样
    减少对象 第二种很明确 一般对象只是创建的话 多使用静态 让所有实例来共享 这样性能高 系统不用每次创建了---减少了创建
    同步必须要做的时候 当然是在必须的地方做. 第三种就写在了 对象未null的情况
    这样 不进if就不会有同步 ---同步降到最低
    一般情况 有线程考虑到地方 使用多个锁 不要使用一个锁---理论上会加大并发数

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

报告相同问题?

悬赏问题

  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题