1
// 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中有一些方法(?)

编辑:也有兴趣同步访问会话范围的地图

4

1 回答 1

3

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

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

第三种解决方案可能是最好的解决方案。如果地图上的操作非常简单,并且被地图的方法覆盖,那么第二个可能就可以了。

关于唯一和随机字符串的生成,您可以将UUID(用于唯一性)和 Random(或 SecureRandom,取决于您的要求)组合起来以获得随机性。

于 2012-10-10T11:32:23.060 回答