2013-05-10 76 views
2

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

下面的代码:

 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++; 
    } 
} 

按布赖恩·格罗茨JCIP每个stafeful对象应该是同步的,所以理想的情况下,我们应该同步这种方法吗?

+0

我想收回我的近距离投票,但不知道如何。 – 2013-05-10 09:53:19

+0

'根据Brian Grotz JCIP,每个有效的对象应该同步错误 - Goetz描述了多种其他技术,例如线程限制,原子变量的使用等。 – vemv 2013-05-10 09:53:52

回答

4

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

另一方面,如果这些对象被重用,则必须同步该方法。另外,例如,如果您的performSomeStatefulOperation更改了某些共享数据的状态,则应该对其进行同步,除非您采取其他步骤以确保其线程安全(例如,使用锁定)。总之,这取决于你在你的方法中做了什么。从你所展示的内容来看,没有必要,如果可能存在多次调用该方法的问题(因为它更新共享状态),那么你应该同步它。

4

由于每个线程都获得自己的StatefulObject实例,而无法与其他线程联系,因此无需同步。