【发布时间】:2015-07-25 23:06:09
【问题描述】:
我看到一个很有趣的消息here,看起来ASP.NET的人必须同步他们对应用程序范围的访问,所以我想知道用Java EE JSP/Servlet技术开发的人是否也有同样的限制.
这里是一个例子:
public class MyServlet extends HttpServlet {
private static Lock applicationScopeLock = new ReentrantLock();
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response){
applicationScopeLock.lock();
try {
ServletContext appScope = this.getServletContext();
appScope.setAttribute("myKey", new MyValue());
} finally {
applicationScopeLock.unlock();
}
}
- 在 JSP/Servlet 技术中操作应用程序范围是否需要同步?
- 如果是,我应该为 setAttribute() 和 getAttribute() 使用同步(锁),还是 setAttribute() 就足够了?
谢谢。
编辑:
我看到了一个类似的主题,其中包含更多细节here²。总结Servlet Specification 3.1 (read §4.5) 只说上下文中的属性可以在同一个Web 应用程序中的不同servlet 之间共享,但没有明确说明setAttribute/getAttribute 是否是线程安全的(Javadoc 都不是)。一些 servlet 容器(如 Tomcat)使用 ConcurrentHashmap 实现(但它不是规范的一部分)。总结一下,我还读到一个好的做法是使用不可变/线程安全的对象作为值。
【问题讨论】:
-
我认为这非常接近重复,因此没有区别。当然,链接问题中的推理适用。
标签: java jakarta-ee servlets scope synchronize