Lazy singleton中的double check
来源:互联网 发布:flash网站源码 编辑:程序博客网 时间:2024/06/12 00:20
单例模式的三个必要条件:私有静态成员变量(这个类的引用),私有函数,获取这个静态成员变量的方法
一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
写eagersingleton时候,你可能这样写:
public class EagerSingleton { private static final EagerSingleton SINGLETON = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton getSingleton() { return SINGLETON; }}
你是不是在想,lazysingleton可以模仿eagersingleton:
public class LazySingleton { private static LazySingleton singleton = null; private LazySingleton() { System.out.println("构造函数被调用"); } public static LazySingleton getSingleton() { if (singleton == null) { singleton = new LazySingleton(); } return singleton; }}
很明确地告诉你,这中写法不符合singleton的要求,为什么?Let me show you now
当遇到多线程的时候,就出问题了,看图吧
那简单啊,在getSingleton()方法前面加个锁就解决问题了:
public class LazySingleton { private static LazySingleton singleton = null; private LazySingleton() { System.out.println("构造函数被调用"); } synchronized public static LazySingleton getSingleton() { if (singleton == null) { singleton = new LazySingleton(); } return singleton; }}
的确问题解决了,但是这样貌似不太好。因为每次调用的getSingleton()方法的时候都会进行线程锁定判断,在多线程高并发的条件下,将会导致系统的性能大大降低。
最终的解决办法是,double check:
public class LazySingleton { private static LazySingleton SINGLETON = null; private LazySingleton() { System.out.println("构造函数被调用"); } public static LazySingleton getSingleton() { // 1st check if (SINGLETON == null) { synchronized (LazySingleton.class) { // 2nd check if (SINGLETON == null) { SINGLETON = new LazySingleton(); } } } return SINGLETON; }}
看吧什么问题也没有
0 0
- Lazy singleton中的double check
- 关于Singleton模式中的Double Check机制
- Singleton和Double Check
- Singleton与Double Check机制
- Design Patterns I - Singleton, Double-Checked locking, Lazy Initialization
- Java 中的Double Check Lock
- Java 中的Double Check Lock
- Java 中的Double Check Lock
- 单例Singleton完美版本实现:double-check
- 单例(Singleton) 双重锁定(Double-Check Locking)
- Java 中的双重检查(Double-Check)
- 单例模式中的Double check lock
- Java 中的双重检查(Double-Check)
- Java 中的双重检查(Double-Check)
- Java 中的双重检查(Double-Check)
- Java 中的双重检查(Double-Check)
- 关于java中的double check lock
- double check
- matlab调用VS生成的DLL
- Python 实例属性VS类属性1
- LightOJ 1028 Trailing Zeroes (I)
- Java自带的XML解析
- uboot——ping通开发板
- Lazy singleton中的double check
- 从圈内到圈外再到圈内
- CSS的滤镜
- 站长如何屏蔽流氓宽带商在你的页面里面强行插入的广告代码
- LightOJ 1026 Critical Links 求桥
- error C2143:语法错误:缺少";"(在“类型”的前面)
- java io
- windows核心编程-列举出当前系统中的所有进程和线程
- 第13章脚本