我理解多线程和同步的整体概念,但对编写线程安全代码是新手。目前,我有下面的代码片段:Java中的线程安全映射
synchronized(compiledStylesheets) {
if(compiledStylesheets.containsKey(xslt)) {
exec = compiledStylesheets.get(xslt);
} else {
exec = compile(s, imports);
compiledStylesheets.put(xslt, exec);
}
}
其中compiledStylesheets
是HashMap
(私人,最终)。我有几个问题。
编译方法可能需要几百毫秒才能返回。这似乎很长时间才能锁定对象,但我没有看到替代方案。此外,除了块之外,没有必要使用Collections.synchronizedMap,对吗?这是除了初始化/实例化之外唯一击中此对象的代码。
另外,我知道ConcurrentHashMap
的存在,但我不知道这是否过度杀伤。 putIfAbsent()
方法在这种情况下不可用,因为它不允许我跳过compile()
方法调用。我也不知道它是否会解决“在containsKey()
之后但在put()
之前修改”的问题,或者如果在这种情况下甚至真的担心这个问题。
编辑:拼写
如何让exec语句将密钥添加到队列中,并让某个进程每隔一段时间执行一次队列呢?通过这种方式保证“安全”并且不会添加相同的密钥多次 –
什么是xlst?你可以锁定。您可以使用“锁定键”缓存方法。或者使用'ConcurrentHashMap'。 –
@MarshallTigerus我假设操作系统需要从该方法返回exec。 – assylias