【问题标题】:Java EE: Is is it wise to make my context attribute thread-safe in this scenario?Java EE:在这种情况下使我的上下文属性线程安全是否明智?
【发布时间】:2011-05-06 20:05:43
【问题描述】:

在 Servlet 3.0 API 的帮助下,我正在为我的网站实现一个动态通知系统(类似于 Facebook)。我计划支持此功能的结构是:

  1. 在每次页面加载时,发送一个 XMLHTTP“get” 向服务器请求
  2. 允许服务器创建 AsyncContext 对象 从这些“获取”请求和存储 它们在应用程序范围的地图中 由用户的网站 ID 键入
  3. 每当用户进行操作时 产生通知,查询 应用程序范围的 ID 的映射 用户的朋友,并使用 AsyncContext 对象存储在那里,发送 通知给每个朋友。
  4. 每个朋友都会收到 通知。

我的问题是:是否有必要使此地图成为线程安全的?在最坏的情况下,代表“通知发送用户”的函数会将通知发送到地图中过时的异步上下文,或者是因为它对应的用户当前正在切换页面并且尚未发送新的 XMLHTTP 请求,或已注销。

然而,在每次页面加载时,我也有代码来检索数据库中比“上次检查日期”更新的所有通知,因此在页面加载时,通知用户不依赖于动态通知系统。因此,如果用户正在切换页面,他仍然会收到通知(显然,如果用户退出,通知的概念是不相关的)。

鉴于此信息,是否有任何场景需要地图是线程安全的?

【问题讨论】:

    标签: java servlets thread-safety servlet-3.0


    【解决方案1】:

    您可能不需要精确的一致性..但您仍然不希望任何线程在写入普通哈希图时读取它(添加可能会导致重新哈希并将获取线程置于无限循环中)。

    此外,这个计划不会很好地扩展到超过 1 台服务器。如果没问题.... 只需使用 ConcurrentHashMap。

    【讨论】:

    • 你能解释一下为什么它不能使用 ConcurrentHashMap 扩展到超过 1 个服务器吗?
    • 它不会扩展到超过 1 台服务器以将所有内容存储在哈希图中。您可能希望将其存储在数据库中并做一些或其他花哨的事情......
    • 另一个问题/评论。 in 上下文时不能更新上下文范围的属性;它们只能设置或检索。 ConcurrentHashMap 在这里不是必需的,因为每个用户都将检索地图的副本以读取/插入数据,然后将其放回同一键下的上下文中。所以问题是我是否需要锁定上下文;我错误地表达了原始问题。你介意回答我更新的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2023-02-23
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多