我正在 Servlet 3.0 API 的帮助下为我的网站实现一个动态通知系统(类似于 Facebook)。我计划支持此功能的结构是:
- 在每次页面加载时,发送 XMLHTTP“get” 向服务器请求
- 允许服务器创建 AsyncContext 对象 从这些“获取”请求并存储 它们位于应用程序范围的映射中 由用户的网站 ID 键入
- 每当用户执行某项操作时 产生通知,查询 应用程序范围的 ID 映射 用户的 friend ,并使用 AsyncContext对象存储在那里,发送 给每个 friend 的通知。
- 每个 friend 都会收到 通知。
我的问题是:是否有必要使这个 map 线程安全?在最坏的情况下,代表“通知发送用户”的函数会将通知发送到 map 中的陈旧异步上下文,因为它对应的用户当前正在切换页面并且尚未切换发送新的 XMLHTTP 请求,或已注销。
但是,在每个页面加载时,我还有代码来检索数据库中比“上次检查日期”更新的所有通知,因此在页面加载时,通知用户不依赖于动态通知系统。因此,如果用户切换页面,他仍然会收到通知(显然,如果用户注销,通知的概念就不相关)。
根据这些信息,是否存在需要映射线程安全的场景?
最佳答案
您可能不需要精确的一致性..但您仍然不希望任何线程在写入时读取正常的 HashMap (添加可能会导致重新哈希并使获取线程陷入无限循环)。
此外,该计划无法很好地扩展到超过 1 个服务器。如果可以的话...只需使用 ConcurrentHashMap 即可。
关于JavaEE : Is is it wise to make my context attribute thread-safe in this scenario?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916464/