2

我有一个名为 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 对象都应该同步,所以理想情况下我们应该同步这个方法?

4

2 回答 2

4

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

于 2013-05-10T09:49:32.373 回答
4

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

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

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

总而言之,这取决于您在方法中所做的事情。从您所展示的内容来看,如果多次调用该方法可能出现问题(因为它更新了共享状态),那么您应该同步它。

于 2013-05-10T09:49:58.583 回答