2012-07-14 82 views

回答

22

你的問題歸結爲:呼籲從多個線程的方法相同的對象是線程安全的。答案是:它取決於。如果你的對象(讓它是servlet)是無狀態的或只有final字段,這是完全線程安全的。局部變量和參數是線程本地的(駐留在堆棧上,而不是堆上)。

另外,每個service()調用接收不同的ServletRequestServletResponse的實例。然而這裏是不安全的servlet的示例:

public class UnsafeServlet implements Servlet { 

    private int counter; 

    public void init(ServletConfig config) throws ServletException { 
    } 

    public void service(ServletRequest request, ServletResponse response) 
     ++counter; 
    } 

    public void destroy() { 
    } 

} 

由於多個線程可以訪問counter變量,它具有以某種方式固定:或者通過使用​​(volatile是不夠的):

synchronized(this) { 
    ++counter; 
} 

AtomicInteger

private AtomicInteger counter = new AtomicInteger(); 

//... 
counter.incrementAndGet(); 

在這種特殊情況下AtomicInteger好得多正弦e它使用CAS CPU操作無鎖,​​是互斥鎖。

+0

@ Tomasz你可以在這裏發表一個簡短的例子,你可以證明你有一個簡單的servlet和2個不同的瀏覽器,你正在提出請求,並通過一個線程故意改變值。這件事我想看.. ..在此先感謝 – user1508454 2012-07-14 16:50:23

+0

偉大的人,請問你現在如何保護櫃檯,並通過同步會影響性能,請你也請解釋一點關於原子整數 – user1508454 2012-07-14 16:54:31

+0

@ user1508454:查看我的更新 – 2012-07-14 17:00:10