gpt4 book ai didi

java - 单例状态的同步

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:05 24 4
gpt4 key购买 nike

我有这个单例。正如我制作的 enum 它对 getInstance 是线程安全的。

public enum ExtensionRegistry {
REGISTRY;

private static final Logger LOGGER = LoggerFactory.getLogger(ExtensionRegistry.class);

// key is a class name
private Map<String, Plugin> extensions = new HashMap<>();

public void registerPlugin(Plugin plugin) {
LOGGER.info("Register plugin: [{}].", plugin);
extensions.put(plugin.getId(), plugin);
}

public Plugin getPlugin(String id) {
return extensions.get(id);
}

public List<String> listAvailablePlugins() {
return extensions.values().stream()
.map(Plugin::getId)
.collect(Collectors.toList());
}

public IPluggable getRegisteredClass(String id) {
Plugin plugin = extensions.get(id);

if (null == plugin) {
LOGGER.debug("No class with id [{}] found in the registry!", id);
return null;
} else {
IPluggable instance = null;
try {
instance = (IPluggable) Class.forName(plugin.getId()).newInstance(); // should exist!
} catch (Exception exc) {
LOGGER.error("Failed to create instance of class with id [{]].", id, exc);
}
return instance;
}
}
}

为了使其真正线程安全,我还应该更改/同步什么?使用 ConcurrentHashMap?为每个方法添加synchronized

最佳答案

在这种情况下,我肯定会使用 ConcurrentMap 实现。在进行顺序调用以检查和更改 Map 时,请记住使用并发方法。

并发很难。即使你做对了,其他人也很容易在以后出现并把它搞砸。使用专家编写的类可以大大提高其正确性和可维护性。

在这段代码中,您仍然可以有竞争条件,因为 set 和 get 是通过您的方法公开的。 Map 是安全的,但不能保证您在调用 get() 时会得到您期望的结果。其他人可以在您之后立即调用 set(),然后您的 get() 将返回“他们的”值。您允许覆盖 registerPlugin 中的值。如果你必须拥有它,那么就没有办法解决这种情况。如果您可以丢失它,那么使用 putIfAbsent() 可以帮助您。

---(删除了不合适的代码)---

关于java - 单例状态的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42410067/

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