- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这个单例。正如我制作的 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!