Java EE Servlet - 我应该同步每个访问应用程序范围吗?

时间:2015-07-25 23:06:10

标签: java java-ee servlets scope synchronize

我看到一条非常有趣的消息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();
        }
    }
  1. 在JSP / Servlet技术中操作应用程序范围是否需要同步?
  2. 如果是,我是否应该为setAttribute()使用同步(锁)以及getAttribute(),或者setAttribute()是否足够?
  3. 感谢。

    编辑:

    我看到了一个类似的主题,其中包含更多细节here²。 sump up Servlet Specification 3.1 (read §4.5)只说上下文中的属性可以在同一个Web应用程序中的不同servlet之间共享,但是没有明确说明setAttribute / getAttribute是否是线程安全的(两者都不是Javadoc)。像Tomcat这样的一些servlet容器使用ConcurrentHashmap实现(但它不是规范的一部分)。最后,我还读到一个好的做法是使用不可变/ threadsafe对象来表示值。

1 个答案:

答案 0 :(得分:-3)

  1. 简短的回答是。这是因为每个传入服务器的请求都在不同的线程中处理。由于应用程序上下文是为所有请求共享的,这意味着它可以以并发方式访问。

  2. 我会选择两者,只是为了安全起见。我甚至会建议你包装整个块,处理在同步块中修改存储在应用程序上下文中的对象。我也会尝试尽可能少地使用这个上下文,因为它带来了很多开销,如果不小心,它可能会导致问题。