我想在servlet初始化期间(在init()方法中)读取一些参数,并将它们存储在servlet上下文属性中(使用getServletContext()。setAttribute())。我想稍后阅读这些参数 - 在一些请求处理期间(使用getServletContext()。getAttribute())。因此,多个线程可以同时执行此操作。我的问题是这样的尝试是否安全?我可以确定对getAttribute()的多线程调用不会搞乱servlet上下文的任何内部状态吗?
请考虑到我不会在初始化之外的任何地方调用setAttribute()。因此,只能从多个线程调用getAttribute()。但是根据内部实施情况,这也可能是危险的。因此,任何有关Tomcat实现的信息都将受到赞赏。
答案 0 :(得分:6)
Tomcat中ServletContext的主要实现是ApplicationContext
类。如果查看链接资源,您将看到属性存储在java.util.concurrent.ConcurrentHashMap
实例中。因此,对于ApplicationContext
,至少getAttribute()
和setAttribute()
方法是线程安全的。