gpt4 book ai didi

java - 线程安全单例、锁

转载 作者:行者123 更新时间:2023-12-02 01:35:37 29 4
gpt4 key购买 nike

我有一个线程安全的 Singleton 类,我需要锁定它的方法吗?

        private static volatile JsonWriter instance;
private static final Object mutex = new Object();

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

private JsonWriter() {
}

public static JsonWriter getInstance() {
JsonWriter result = instance;
if (result == null) {
synchronized (mutex) {
result = instance;
if (result == null) {
instance = result = new JsonWriter();
}
}
}
return result;
}

是否需要像这样锁定每个方法以确保线程安全?

    public void write(String filePath, ArrayNode content) throws IOException {
lock.writeLock().lock();
File file = new File(MASTER_DIR + "/" + filePath);
mapper.writerWithDefaultPrettyPrinter().writeValue(Files.newOutputStream(file.toPath()), content);

}

最佳答案

性能最好且线程安全的 Singleton 实现是 William Pugh Singleton。您不需要同步块(synchronized block)和ReentrantReadWriteLock

William Pugh 实现可确保多线程安全和最佳性能,因为它避免了急于创建。事实上,在类级别初始化的静态成员 INSTANCE 仅在类加载器加载嵌套类时(即实际使用嵌套类时)才会创建。在以下实现中,只有在调用 getInstance() 方法时才会发生这种情况。事实上,与 EagerSingleton 相反,该模型实际上允许使用封闭类,而不会导致急切的实例化。这意味着封闭类提供的任何其他方法都可以安全地使用,而无需初始化INSTANCE;只有 getInstance() 方法会导致它。

您的实现可能如下所示:

class JsonWriter {

private JsonWriter() {}

/* ... other methods ... */

public static JsonWriter getInstance() {
return SingletonHelper.INSTANCE;
}

private static class SingletonHelper {
private static final JsonWriter INSTANCE = new JsonWriter();
}
}

特别感谢@Holger,他在评论中提供了重要的澄清和评论。

关于java - 线程安全单例、锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72449405/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com