`
dsxwjhf
  • 浏览: 70669 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

单例模式

阅读更多
package com.wjxie.designpattern;

/**
*
* 单例模式。
*
* volatile 作用:
* 1. 其它线程立即可见;
* 2. 禁止指令重排序。
*
*/
public class Singleton {

    private static volatile Singleton instance = null;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if (instance == null) {
            // 下面这句可能需要等待其它线程释放 Singleton.class 的对象锁,本线程被阻塞。如果是这样,那意味着:
            // 本线程执行上面 instance == null 判断的时候,已经有别的线程开始构造 instance 实例了,但还没有构造完毕。因此 if 条件成立,程序走到了这里。
            // OK ,我们等了5秒钟。这时候其它线程对 instance 的初始化过程执行完毕了,它释放了 Singleton.class 的对象锁,被本线程得到,继续执行同步块内的代码。
            // 这就是我们为什么需要再次判断 instance == null 的原因,如果不做判断有可能会再创建一个对象。
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics