2013-05-10 102 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實例,而無法與其他線程聯繫,因此無需同步。