最近在看 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人访问的时候才能体现出效果。
我认为还是第二种比较好,第三种吗也挺好,还是看使用场景,如果是类似秒杀的情况用第二种,如果不是秒杀,系统又需要延迟加载(或者使用的时候在加载)用第三种。
第一种,因为同步,串行处理,在高并发的时候,影响效率。
第二种,解决了效率也解决了线程安全问题。
第三种,在多线程高并发的时候第一次访问也存在效率问题,比如第一次同时有100人访问, 第一个if(uniqueInstance == null),最坏情况会有100人if里面,synchronized(SingletonTest.class)同步产生串行处理。第101人访问的时候才能体现出效果。
我认为还是第二种比较好,第三种吗也挺好,还是看使用场景,如果是类似秒杀的情况用第二种,如果不是秒杀,系统又需要延迟加载(或者使用的时候在加载)用第三种。
但是。。。针对第二种情况 我有些不明白什么 叫 ”在创建和运行时方面的 负担繁重“。。。。。
说真的。。我对这个概念很模糊。。。能解释一下么???