当前位置:  开发笔记 > 程序员 > 正文

这是双重检查锁定的安全版本吗?

如何解决《这是双重检查锁定的安全版本吗?》经验,为你挑选了2个好方法。

来自维基百科的经典破坏双重检查锁定的略微修改版本:

class Foo {
    private Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            synchronized(this) {
                if (helper == null) {

                    // Create new Helper instance and store reference on
                    // stack so other threads can't see it.
                    Helper myHelper = new Helper();

                    // Atomically publish this instance.
                    atomicSet(helper, myHelper);
                }
            }
        }
        return helper;
    }
}

假设基础原子操作库正常工作,只是简单地发布新创建的Helper实例原子使这个双重检查的锁定习惯安全吗?我意识到在Java中,人们可以使用volatile,但即使示例是伪Java,这应该是一个与语言无关的问题.

也可以看看:

双重检查锁定物品



1> Jon Skeet..:

它完全取决于您的平台/语言的确切内存模型.

我的经验法则:就是不要这样做.无锁(或减少锁定,在这种情况下)编程很难,除非你是一个线程忍者,否则不应该尝试.你应该只有在你有真正需要它的分析证明时才考虑它,在这种情况下,你会获得关于该特定平台的线程绝对最好和最新的书,看看它是否可以帮助你.



2> Hank Gay..:

我不认为你可以用语言无关的方式回答这个问题而不必彻底摆脱代码.这一切都取决于您的伪代码的工作方式synchronizedatomicSet工作方式.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有