什麼是線程安全
java
線程安全是指:當多個線程訪問某個類時,無論運行時環境採用何種調度方式或者這些線程如何交替執行,該類始終能表現出正確的行爲。
一個類是否線程安全的,取決於兩點:是否被多線程共享;狀態是否可變。單線程環境中不涉及變量共享,不會產生線程安全性問題。多線程環境中共享無狀態的對象和狀態不可變的對象也不會產生線程安全性問題。
原子性
對於計數器counter++這種由「 讀取-修改-寫入 」組合而成的操做,在執行過程當中必須當作是一個總體不被分割,不能被打斷, 三個子操做要麼徹底都不執行,要麼三個按順序依次都執行。
加鎖機制
解決線程安全問題的辦法就是使用加鎖這一同步機制。因爲鎖能使其保護的代碼段以串行形式來訪問,至關於讓線程以獨佔的方式來訪問狀態變量,所以提供了很好的安全性。加鎖須要注意一下幾點:
一、A線程在得到對象O的鎖S以後,B線程若是要獲取鎖 S 就必須等待A釋放鎖,可是B任然能夠訪問對象O的其餘未被S加鎖的方法(非同步方法 或者 用其餘對象做爲鎖的方法),所以對同一狀態變量(或者組合狀態)的同步必須使用同一個對象做爲鎖,不然任然會出現線程安全問題。
二、頻繁的獲取鎖和釋放鎖自己就很消耗性能,所以在加鎖時須要注意一下事項:
A)、只有被多線程同時訪問的可變數據才須要加鎖保所,爲單線程或共享不可變數據而加鎖不只毫無意義,並且耗了性能。
B)、儘可能將不影響共享狀態且執行時間較長的操做移到同步代碼塊以外, 使同步代碼塊的執行時間縮短,也使正在等待的線程在拿到鎖以前先將這些操做執行完,一旦拿到鎖就能夠快速執行完。
編程
以上就是簡單介紹下java併發編程與線程安全,若有表述不當敬請諒解!
多線程