7
可能重複:
How do servlets work? Instantiation, session variables and multithreading關於線程安全
是的servlet是線程安全的..?對於前如果我打開5級不同的瀏覽器,並在容器發送請求到一個servlet中,它仍然是線程安全的,我指的service()
方法特別
可能重複:
How do servlets work? Instantiation, session variables and multithreading關於線程安全
是的servlet是線程安全的..?對於前如果我打開5級不同的瀏覽器,並在容器發送請求到一個servlet中,它仍然是線程安全的,我指的service()
方法特別
你的問題歸結爲:呼籲從多個線程的方法相同的對象是線程安全的。答案是:它取決於。如果你的對象(讓它是servlet)是無狀態的或只有final
字段,這是完全線程安全的。局部變量和參數是線程本地的(駐留在堆棧上,而不是堆上)。
另外,每個service()
調用接收不同的ServletRequest
和ServletResponse
的實例。然而這裏是不安全的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;
}
private AtomicInteger counter = new AtomicInteger();
//...
counter.incrementAndGet();
在這種特殊情況下AtomicInteger
好得多正弦e它使用CAS CPU操作無鎖,是互斥鎖。
@ Tomasz你可以在這裏發表一個簡短的例子,你可以證明你有一個簡單的servlet和2個不同的瀏覽器,你正在提出請求,並通過一個線程故意改變值。這件事我想看.. ..在此先感謝 – user1508454 2012-07-14 16:50:23
偉大的人,請問你現在如何保護櫃檯,並通過同步會影響性能,請你也請解釋一點關於原子整數 – user1508454 2012-07-14 16:54:31
@ user1508454:查看我的更新 – 2012-07-14 17:00:10