2011-05-06 39 views
0

我在Servlet 3.0 API的帮助下为我的网站实施了一个动态通知系统(la Facebook)。我支持这个功能的规划的结构是:Java EE:在这种情况下让我的上下文属性线程安全是明智的吗?

  1. 在每个页面加载,发送XMLHTTP“得到” 请求到服务器
  2. 允许服务器创建AsyncContext从这些“得到”的要求和存储对象 他们在用户的网站ID键入一个应用程序范围的地图
  3. 每当用户在产卵通知的动作 配合,查询的 ID的用户的朋友的 应用范围的地图,并使用将AsyncContext对象存储在那里,将 通知发送给每个朋友。
  4. 每位朋友收到 通知。

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

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

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

回答

2

您可能不需要确切的一致性..但您仍然不希望任何线程正在写入正常的哈希映射(正在写入一个添加可能会导致重新刷新并将获取的线程放入无限循环中)。

此外,这个计划不会超过1台服务器。如果那是OK ....只需使用ConcurrentHashMap。

+0

你能解释为什么它不会使用ConcurrentHashMap来扩展1台服务器吗? – Kevin 2011-05-06 20:18:06

+0

它不会伸缩过去1台服务器以将所有内容存储在散列表中。你会想把它存储在数据库中,做一些事情或其他想法...... – bwawok 2011-05-06 21:56:22

+0

另一个问题/评论。上下文范围的属性不能在* in *上下文中更新;他们只能设置或检索。 ConcurrentHashMap在这里不是必需的,因为每个用户都会检索映射的副本以读取/插入数据,然后将其放回到同一个键下的上下文中。所以问题是我是否需要锁定上下文;我错误地回答了原来的问题。你介意回答我最新的问题吗? – Kevin 2011-05-07 00:49:54

相关问题