ConcurrentHashMap是在Servlet中使用的可靠选择吗?

时间:2011-09-17 18:50:46

标签: java servlets hashmap

我需要在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");
    }

}

3 个答案:

答案 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请求。最好将该功能移至可以完成工作的服务。