java并發編程與線程安全

jopen 8年前發布 | 16K 次閱讀 Java開發

什么是線程安全

如果對象的狀態變量(對象的實例域、靜態域)具有可變性,那么當該對象被多個線程共享時就的考慮線程安全性的問題,否則很可能出現與預期不同的結果。

線程安全是指:當多個線程訪問某個類時,不管運行時環境采用何種調度方式或者這些線程如何交替執行,該類始終能表現出正確的行為。

一個類是否線程安全的,取決于兩點:是否被多線程共享;狀態是否可變。單線程環境中不涉及變量共享,不會產生線程安全性問題。多線程環境中共享無狀態的對象和狀態不可變的對象也不會產生線程安全性問題。

原子性

對于計數器counter++這種由“ 讀取-修改-寫入 ”組合而成的操作,在執行過程中必須當做是一個整體不被分割,不能被打斷, 三個子操作要么完全都不執行,要么三個按順序依次都執行。

加鎖機制

解決線程安全問題的辦法就是使用加鎖這一同步機制。由于鎖能使其保護的代碼段以串行形式來訪問,相當于讓線程以獨占的方式來訪問狀態變量,因此提供了很好的安全性。加鎖需要注意一下幾點:
1、A線程在獲得對象O的鎖S之后,B線程如果要獲取鎖 S 就必須等待A釋放鎖,但是B任然可以訪問對象O的其他未被S加鎖的方法(非同步方法 或者 用其他對象作為鎖的方法),因此對同一狀態變量(或者組合狀態)的同步必須使用同一個對象作為鎖,否則任然會出現線程安全問題。

2、頻繁的獲取鎖和釋放鎖本身就很消耗性能,因此在加鎖時需要注意一下事項:

A)、只有被多線程同時訪問的可變數據才需要加鎖保所,為單線程或共享不可變數據而加鎖不僅毫無意義,而且耗了性能。

B)、盡量將不影響共享狀態且執行時間較長的操作移到同步代碼塊之外, 使同步代碼塊的執行時間縮短,也使正在等待的線程在拿到鎖之前先將這些操作執行完,一旦拿到鎖就可以快速執行完。

C)、同步代碼塊不應拆解的過細,需要在安全性、簡單性和性能上進行權衡。

 

以上就是簡單介紹下java并發編程與線程安全,如有表述不當敬請諒解!

來自: http://www.elsyy.com/news/2014/0630/3910032050_2.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!