java - 线程安全地循环通过 ConcurrentHashMap,无阻塞

标签 java concurrency thread-safety blocking

我正在开发一个超低延迟和高性能的应用程序。 核心是单线程,所以不需要担心并发问题。

我正在开发一个计划日志功能,它定期记录消息以防止相同的消息刷新在日志中。

因此日志类包含一个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/

相关文章:

java - 设置 JButton 大小

java - 使用 Spring MVC 和 Hibernate 将 JSP 中的对象作为外键发送

c++ - gsoap 作为 soap 客户端是线程安全的吗?

objective-c - 如何从辅助线程安全地访问 NSArray 属性的内容?

java - 使用 JasperReports 导出到 Excel : How to add AutoFilter for columns

java - 旋转 Android 应用程序的文本和图标

javascript - 拦截器上的 axios 多请求

python - 为什么这个 Dekker 算法实现有效?

Go 并发 : Chudnovky's algorithm, 比同步慢

thread-safety - Jersey 的@Context HttpServletRequest 范围