这里需要同步吗?

时间:2013-05-10 09:44:44

标签: java concurrency

我有一个名为Statelessservlet的servlet,它每次都会实例化一个新的stafeful对象。我是否需要为此有状态对象提供同步?

以下是代码:

      public class StatelessServlet extends HttpServlet {

        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            StatefulObject stObj = new StatefulObject(Integer.parseInt(req.getParameter("id")));
            stObj.performSomeStatefulOperation();
            ...
        }

    }

    class StatefulObject {
        private int id;

        public StatefulObject(int id) {
            this.id = id;
        }

    //Is synchronized really needed here???
    public synchronized void performSomeStatefulOperation() {
        id++;
    }
}

根据Brian Grotz JCIP,每个stafeful对象都应该同步,所以理想情况下我们应该同步这个方法吗?

2 个答案:

答案 0 :(得分:4)

不需要同步,因为每个线程都有自己的StatefulObject实例,而其他线程无法访问它。

答案 1 :(得分:4)

如果与服务器的每次交互都创建了一个新对象并将其丢弃,那么不进行同步是相对安全的(同时访问该服务的多个线程之间没有共享状态)。

另一方面,如果重用这些对象,则必须同步该方法。

此外,例如,如果您的performSomeStatefulOperation更改了某些共享数据的状态,那么您应该同步它,除非您采取其他步骤来保证其线程安全(例如,使用锁)。

总结一下,这取决于你在方法中做了什么。从你所展示的内容来看,没有必要,如果该方法的多次调用可能存在问题(因为它更新了共享状态),那么你应该同步它。