servlets - 应用程序范围内的同步访问属性

时间:2012-10-09 22:00:30

标签: servlets synchronization

// in a context listener
public void contextInitialized(ServletContextEvent sce) {
        SessionListener.context = sce.getServletContext();
        HashMap<String, String> messages = new HashMap<>();
        context.setAttribute("messages", messages);
}

现在我想从各种servlet访问消息映射 - 同步怎么样?

即我想在地图中添加一个元素(其键必须是唯一的) - 所以我必须尝试几次 - 除非java ee api中有一些方法(?)

编辑:对同步访问会话范围地图感兴趣

1 个答案:

答案 0 :(得分:3)

此映射是由多个线程共享的非线程安全对象。因此,应该同步对地图的每次访问。您有多种选择:

  • 让地图的每个客户端在地图上本身同步:非常脆弱
  • 使用类似Collections.synchronizedMap()或ConcurrentHashMap的线程安全映射。这永远不会让映射处于不一致的状态,但是对于应该是原子的但在地图上涉及多个方法调用的操作仍然需要额外的同步
  • 将地图封装到您自己的对象中,并确保此对象提供了需要在地图上完成的所有必要操作。这些操作当然应该执行必要的同步。

第三种解决方案可能是最好的解决方案。如果地图上的操作非常简单,并且由地图的方法覆盖,则第二个可能没问题。

关于生成唯一和随机字符串,您可以将UUID(对于唯一性)和随机(或SecureRandom,取决于您的要求)组合为随机性。