我看到一条非常有趣的消息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();
}
}
感谢。
编辑:
我看到了一个类似的主题,其中包含更多细节here²。 sump up Servlet Specification 3.1 (read §4.5)只说上下文中的属性可以在同一个Web应用程序中的不同servlet之间共享,但是没有明确说明setAttribute / getAttribute是否是线程安全的(两者都不是Javadoc)。像Tomcat这样的一些servlet容器使用ConcurrentHashmap实现(但它不是规范的一部分)。最后,我还读到一个好的做法是使用不可变/ threadsafe对象来表示值。
答案 0 :(得分:-3)
简短的回答是是。这是因为每个传入服务器的请求都在不同的线程中处理。由于应用程序上下文是为所有请求共享的,这意味着它可以以并发方式访问。
我会选择两者,只是为了安全起见。我甚至会建议你包装整个块,处理在同步块中修改存储在应用程序上下文中的对象。我也会尝试尽可能少地使用这个上下文,因为它带来了很多开销,如果不小心,它可能会导致问题。