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

标签 multithreading language-agnostic locking atomic

Wikipedia的规范化的经过仔细检查的双重检查锁定的稍作修改的版本:

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中,这也应该是一个与语言无关的问题。

另请参见:

Double checked locking Article

最佳答案

这完全取决于平台/语言的确切内存模型。

我的经验法则:就是不要这样做。无锁(或在这种情况下为减少锁)编程很难,除非您是线程忍者,否则不应尝试编程。您只有在拥有确实需要它的性能分析证明时才考虑使用它,在这种情况下,您将获得有关该特定平台的绝对最佳和最新的有关线程的书籍,并查看它是否可以为您提供帮助。

关于multithreading - 这是双重检查锁定的安全版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583123/

相关文章:

java - 是否没有办法迭代或复制 Java ThreadLocal 的所有值?

exception - 为什么我不应该将每个 block 都包装在 "try"-"catch"中?

java - SwingWorker 完成后挂起 : Is it bad practise to start and run a thread pool from a SwingWorker?

Java 不阻塞 I/O 的最佳默认线程数

php - 检测按顺序完成的线程

algorithm - 找到矩阵中最后一个像螺旋一样行走的正方形

language-agnostic - 我应该继承还是使用枚举?

c# - 锁内锁背后的基本原理?

mysql - 如何保证事务在查询之前已在 MySQL 中提交?

linux - 避免同一 bash 脚本的两个实例