我正在开发一个超低延迟和高性能的应用程序。 核心是单线程,所以不需要担心并发问题。
我正在开发一个计划日志功能,它定期记录消息以防止相同的消息刷新在日志中。
因此日志类包含一个ConcurrentHashMap
,一个线程更新它(放入新键或更新现有值),另一个线程定期循环遍历映射以记录所有消息。
我担心的是,由于需要在循环遍历 map 时进行记录,这可能需要时间,它会阻止尝试更新 map 的线程吗?任何阻塞都是 Not Acceptable ,因为我们的应用程序核心是单线程的。
除了 ConcurrentHashMap 之外,还有其他数据结构可以用来减少内存占用吗?
是否有一种线程安全的方法来迭代 Map 而不会在只读情况下阻塞?即使迭代的数据可能已经过时,仍然可以接受。
最佳答案
根据the java API docs ,它说:
[...] even though all operations are thread-safe, retrieval operations do not entail locking [...]
此外,entrySet()方法文档告诉我们:
The [returned] set is backed by the map, so changes to the map are reflected in the set, and vice-versa.
这意味着在迭代完成时可以对 map 进行修改,这意味着它确实不会阻塞整个 map 。
关于java - 线程安全地循环通过 ConcurrentHashMap,无阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54221919/