java 并发实践 16.7

标签 java multithreading concurrency

此代码用于演示双重检查锁定反模式:

@NotThreadSafe
public class DoubleCheckedLocking {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null) {
            synchronized (DoubleCheckedLocking.class) {
                if (resource == null)
                    resource = new Resource();
            }
        }
        return resource;
    }
}

我可以通过修改它来避免这个问题吗:

@NotThreadSafe
public class DoubleCheckedLocking {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null) {
            synchronized (DoubleCheckedLocking.class) {
                if (resource == null){
                    Resource r=new Resource();
                    resource = r;
                }
            }
        }
        return resource;
    }
}

据我所知,

Resource r=new Resource();
resource = r;

该编译器应该为此提供先发生关系。

最佳答案

据我所知,唯一已知的双重检查锁定模式(对于 JDK5 及更高版本)有效的实现使用了“volatile”关键字。 See Fixing Double-Checked Locking using Volatile

关于java 并发实践 16.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438687/

相关文章:

java - 如何在 Java 中创建自定义注释以允许参数具有指定范围内的值?

java - 在 map 中使用泛型和对象的类

java - 如何使用angular js spring mvc上传多部分文件

concurrency - 如何在并行执行中启动具有不同参数的相同作业?

java - 在指定的超时后从一个线程执行多个 Runnable

.net - 这似乎是并发集合/队列组合的合理方法吗?

java - myClass.System 无法解析为类型

python - 如何修复 Python 中线程的基本示例

c++ - 在 C++ 中线程化 Redis 连接

java - 线程池如何能够重用线程?