// 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中有一些方法(?)
编辑:对同步访问会话范围地图感兴趣
答案 0 :(得分:3)
此映射是由多个线程共享的非线程安全对象。因此,应该同步对地图的每次访问。您有多种选择:
Collections.synchronizedMap()
或ConcurrentHashMap的线程安全映射。这永远不会让映射处于不一致的状态,但是对于应该是原子的但在地图上涉及多个方法调用的操作仍然需要额外的同步第三种解决方案可能是最好的解决方案。如果地图上的操作非常简单,并且由地图的方法覆盖,则第二个可能没问题。
关于生成唯一和随机字符串,您可以将UUID(对于唯一性)和随机(或SecureRandom,取决于您的要求)组合为随机性。