在理解什么是線程安全性,講到一個實例:
一個無狀態(tài)的Servlet
@ThreadSafe
public class StatelessFactorizer?implements Servlet{
public void service (ServletRequest req,?ServletResponse resp){
BigInteger i = extractFromRequest(req);
BigInteger[] factors=factors(i);
encodeIntoResponse(resp,factors);
}
}
與大多數(shù)Servlet一樣,StatelessFactorizer?是無狀態(tài)的:既不包含任何域,也不包含任何對其他類中域的引用论笔。
servlet如果定義了一個static類型的成員變量--有狀態(tài)的servlet
任何你處理的時候如果要改這個字段并進行處理,可能你第一次請求改了這個字段?之后處理之前??這個字段就被第二個并發(fā)請求給改了--線程不安全
如果你一個成員變量都沒有 就不會有這個問題--無狀態(tài)的servlet
無狀態(tài)對象一定是線程安全的遍愿。
在線程安全類中封裝了必要的同步機制岳服,因此客戶端無須進一步采取同步機制矿筝。
當(dāng)多個線程訪問某一個類時猛们,不管運行時環(huán)境采用何種調(diào)度方式或者這些線程將如何交替執(zhí)行念脯,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)同,這個類都能表現(xiàn)出正確行為弯淘,那么這個類是線程安全的绿店。