格言:在程序猿界混出點名堂!
《JAVA併發編程實戰》解讀
【連載】第2章-2.1什麼是線程安全性
回顧:第一章主要介紹線程的簡史,讓大家知道什麼是線程,線程存在哪裏,利和弊是什麼,這一章會爲後面的章節打下基礎,介紹什麼是線程安全性。
共享和可變
共享
意味着變量可以被多線程同時訪問,這個很好理解。
可變
則意味着變量的值在其生命週期內可以發生變化。相對不可變而言,比如Java中我們熟悉的關鍵字final
,如果變量是final就不存在線程安全問題。
因此,共享
和可變
是造成線程不安全的必然條件,因此有以下三種方式可以避免不安全的發生:
- 變量不共享,多線程依次訪問或者單線程訪問。
- 使用不可變變量
- 多線程訪問使用同步。
什麼是線程安全性
書中說了幾個段落,其實就一句話:所見即所知(We know it when we see it.)
。就是程序表現出來的行爲和狀態和你所期望的是一致的。
無狀態
無狀態一定是線程安全的
書中講的就是Servlet的示例代碼,大概意思就是方法中使用的都是局部變量,不存在共享變量,這個Servlet也就是線程安全。無狀態
也就是沒有共享變量的意思,也就是沒有共享狀態。見書中例子:
@ThreadSafe
public class StatelessFactorizer implements Servlet{
public void service(ServletRequest req, ServletResponse resp){
BigInteger I = extractFromRequest(req);
BigInteger[] factors = factor(i);
encodeIntoResponse(resp,factors);
}
}
知識點
- 共享和可變是導致線程出現不安全的條件。
- 線程安全性的理解:所見即所知。
- 什麼是無狀態。
喜歡連載可關注
簡書
或者微信公衆號
:
簡書專題:Java併發編程實戰-可愛豬豬解讀
https://www.jianshu.com/c/ac717321a386
微信公衆號:逗哥聊IT
。