我們經常說類是線程安全的,類是線程不安全的。那麼什麼樣的類才是線程安全的?
多線程環境下,不管不同的線程如何使用和調度這個類,這個類總是錶現出正確的行為。那麼這個類就是線程安全的。
類的線程安全有兩個關鍵點:
1.操作的原子性
2.內存的可見性。
如果在多個線程中共享狀態,當同步機制不正確時,就會出現線程不安全的情况。
Q:什麼情况下會有線程安全問題
A:當某個實現多線程的線程類中有實例變量時
ps:有狀態,無狀態對象是什麼概念
有狀態就是有數據存儲功能。有狀態對象(Stateful Bean),就是有實例變量的對象?,可以保存數據,是非線程安全的。在不同方法調用間不保留任何狀態。
無狀態就是一次操作,不能保存數據。無狀態對象(Stateless Bean),就是沒有實例變量的對象?.不能保存數據,是不變類,是線程安全的。
當多個線程同時共享,同一個全局變量或靜態變量,做寫的操作時,可能會發生數據沖突問題,也就是線程安全問題。但是做讀操作是不會發生數據沖突問題。
從內存讀取1M數據 250微妙 = 250000納秒
CPU讀取一次內存 100納秒
問:從內存中讀取1M的int型數據由CPU進行累加,耗時要多久?
答:
1M的數據,Java裏int型為32比特,4個字節
共有1024*1024/4 = 262144個整數
CPU 計算耗時:262144 *0.6 = 157 286 納秒
262144個整數從內存讀取到CPU,需要耗時
內存讀取耗時:262144*100+250000 = 26 464 400 納秒
線程安全問題,歸根到底一句話:在多線程之間修改共享數據引起的
為了讓大家更好的理解學習線程並發,在這裏給大家推薦一個由華為資深架構師Mark老師講授的《並發編程——從入門到入仙》專題課程!從Java線程入門,到原子操作CAS與顯式鎖,再到並發安全,三天快速掌握並發編程核心知識,成為並發大神!
你以為這樣就完了?更多並發相關資料,一並奉上!
學完之後,若是想驗收效果如何,其實最好的方法就是可自己去總結一下。比如我就會在學習完一個東西之後自己去手繪一份xmind文件的知識梳理大綱腦圖,這樣也可方便後續的複習,且都是自己的理解,相信隨便瞟幾眼就能迅速過完整個知識,腦補回來。下方即為我手繪的MyBtis知識腦圖,由於是xmind文件,不好上傳,所以小編將其以圖片形式導出來傳在此處,細節方面不是特別清晰。但可給感興趣的朋友提供完整的MyBtis知識腦圖原件(包括上方的面試解析xmind文檔)
CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】
除此之外,前文所提及的Alibaba珍藏版mybatis手寫文檔以及一本小小的MyBatis源碼分析文檔——《MyBatis源碼分析》等等相關的學習筆記文檔,也皆可分享給認可的朋友!