什麼是線程安全

https://blog.csdn.net/suifeng3051/article/details/52164267java

我的總結:web

  • 線程安全:原子性、可見性、有序性
  • 線程安全能夠簡單理解爲
    • 一個方法或者一個實例能夠在多線程環境中使用而不會出現問題
  • 多個線程訪問了相同的資源
    • 同一內存區(變量,數組,或對象)、系統(數據庫,web services等)或文件等
  • 只有在一或多個線程向這些資源作了寫操做時纔有可能發生,
    • 只要資源沒有發生變化,多個線程讀取相同的資源就是安全的
  • 咱們沒法知道操做系統什麼時候會在兩個線程之間切換
    • 有序性會被打破
  • 基礎類型的局部變量是線程安全的

    • 定義在方法內部的局部變量
    • 局部的對象引用就不必定,由於對象存在堆裏面,能夠存在多個引用

  • 判斷資源對象是不是線程安全

    • 好比:多線程各自建立數據庫鏈接,在鏈接層面是線程安全的
    • 可是操做的是數據庫相同的數據,在數據庫層面就不是線程安全的
  • 即便一個對象是線程安全的不可變對象,指向這個對象的引用也可能不是線程安全的
    • 好比ConcurrentHashMap 是線程安全的,可是使用它 get,再set 也不是線程安全的

Java中實現線程安全的方法數據庫

  • 在Java多線程編程當中,提供了多種實現Java線程安全的方式:
    • 最簡單的方式,使用Synchronization關鍵字:Java Synchronization介紹
    • 使用java.util.concurrent.atomic 包中的原子類,例如 AtomicInteger
    • 使用java.util.concurrent.locks 包中的鎖
    • 使用線程安全的集合ConcurrentHashMap
    • 使用volatile關鍵字,保證變量可見性(直接從內存讀,而不是從線程cache讀)  
相關文章
相關標籤/搜索