線程安全

線程安全在Wikipedia裏面的定義:

Thread safety is a computer programming concept applicable to multi-threaded code. Thread-safe code only manipulates shared data structures in a manner that ensures that all threads behave properly and fulfill their design specifications without unintended interaction. There are various strategies for making thread-safe data structures.

線程安全的級別

  • 線程安全 這種情況下其實沒有線程安全問題,比如,每個人都有自己專用的衛生間,所以不會存在競爭
  • 條件安全 所有人共用幾個衛生間,搶到資源的就把門關上,通過門來隔離資源,後面的人就在外面等待
  • 不安全 衛生間連門都沒有,不能保證資源安全

實現線程安全的方式

  • 避免共享數據結構,共享狀態:(1)使用線程local變量 (2)使用不可變對象
  • 共享不可避免,通過條件來確保:(1)互斥鎖 (2)CAS原子操作

Java的線程安全策略

  • java.lang.ThreadLocal<T>變量
  • 不可變對象: String
  • 互斥鎖包括JDK5前的內置鎖synchronized和JDK5後的java.util.concurrent.locks.Lock接口
  • java.util.concurrent.atomic.*類

一般,避免共享數據結構能比較優雅的解決併發問題,這種程序對多線程更友好,性能更高。比如單機的ThreadLocal和分佈式的Actor模型。這裏面不存在競爭。其次是不可變變量,多線程操作的都是CopyOnWrite,這也是爲什麼一些動態編程語言如Scala的默認數據結構大多都是不可變的。不可變有其好處,但缺點也明顯,如果需頻繁對數據修改,那麼會創建很多臨時對象並佔用較多內存。以上兩種稱無鎖實現,性能好。如果避免不了共享數據,性能比較好的就是CAS原子操作,這種一般也稱無鎖,但其實是利用了OS的原子指令來實現,在競爭不激烈的場景下性能較好,一般的編程語言都有封裝好的工具類。如果競爭激烈,其實性能未必比使用互斥鎖高。互斥鎖也稱重量級鎖,需OS干涉線程的調度,適用於競爭激烈的場景,這種方式下線程上下文的交換會降級系統的性能,使用時需注意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章