我需要在Servlet中映射对象。 ConcurrentHashMap是一个可靠的选择吗?所有请求都会从地图中获取请求的对象还是会出现故障?
public class MyServlet extends HttpServlet {
private Map<String, Object> map = new ConcurrentHashMap<String, Object>();
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// use map
map.get("myObjectName");
}
}
答案 0 :(得分:5)
ConcurrentHashMap
的目的是允许检索而不锁定。它适用于具有大量读取和极少写入的多线程程序。
你写了
在servlet init之后,对象不会被修改。 - 新手
如果你的意思是在servlet初始化之后地图没有改变,那么你根本就不需要ConcurrentHashMap
。您可以使用普通的HashMap
。更好的方法是使用Collections.unmodifiableMap
将其转换为不可修改的地图。
答案 1 :(得分:4)
由于地图仅在启动时初始化,因此您应该考虑使用Guava的ImmutableMap
:
private static final ImmutableMap<String, Object> MY_MAP = ImmutableMap
.<String, Object>builder()
.put("asdf", myObj1)
.put("qwerty", myObj2)
.build();
Builder
用于预先填充具有所需值的地图,之后调用build()
返回地图。从那时起,它是不可变的,使其线程安全。
您还可以将of
工厂方法用于有限数量的键值对:
private static final ImmutableMap<String, Object> MY_MAP = ImmutableMap.of(
"asdf", myObj1,
"qwerty", myObj2
);
答案 2 :(得分:0)
答案取决于方法的其余部分是否改变了地图。
无法保证对地图的更改将成为ACID。
在servlet中拥有这样的共享状态通常是个坏主意。它们用于处理HTTP请求。最好将该功能移至可以完成工作的服务。