gpt4 book ai didi

java - 在初始化私有(private)静态变量时使用 getClass() 进行同步是不是一个坏主意?

转载 作者:行者123 更新时间:2023-12-01 19:41:28 24 4
gpt4 key购买 nike

所以问题就在这里。我有以下抽象类。

  public abstract class JAXBParser<T> {

private static final Object lock = new Object();

private static volatile JAXBContext context;

private JAXBContext getContext() {
if (context == null) {
synchronized (getClass()) {
if (context == null) {
try {
context = JAXBContext.newInstance(getJAXBClass());
} catch (JAXBException e) {
log.error("Couldn't create JAXB context", e);
}
}
}
}

return context;
}

@SuppressWarnings("unchecked")
public Optional<T> parse(File file) {
log.debug(file.getAbsolutePath());
try {
JAXBContext context = getContext();
Unmarshaller unmarshaller = context.createUnmarshaller();

return Optional.ofNullable((T) unmarshaller.unmarshal(file));
} catch (JAXBException e) {
log.error(unmarshallerError(file.getAbsolutePath()), e);
}

return Optional.empty();
}

protected abstract Class getJAXBClass();
}

我的想法是,我将拥有几个具有相同行为的解析器,这样我就可以使用它来遵循 DRY 原则(并使用继承、多线程、同步等)。也在 this问题指出 JAXBContext 初始化很繁重,因此最好初始化一次。因此,我决定使用双重检查锁定为每个子类初始化一次。

问题如下:

使用 getClass() 进行同步是不是一个坏主意?使用锁对象会更好吗?为什么?

最佳答案

Class 的实例也是一个 Object,在其上同步是完全有效的。

但是,由于只有一个实例,如果您将来需要多个实例,您将无法区分不同的(不相关的)同步部分。

这也是声明方法 synchronized 的问题 - 它们不仅自身同步,而且还与其所有同级以及可能在对象上同步的所有其他外部代码同步,而这并不总是如此显而易见。

关于java - 在初始化私有(private)静态变量时使用 getClass() 进行同步是不是一个坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298585/

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