線程安全性的文檔化(70)

當一個類的實例或者靜態方法被併發使用的時候,這個類的行爲如何,安全

  • 是該類與客戶端程序的行爲約束
  • 若是文檔中沒有相關描述,那麼可能致使未同步或過分同步的狀況

並非說文檔中出現Synchronized 就說明是線程安全併發

  • synchronized 可能僅僅是實現細節

線程安全是分多種級別的:dom

  • 一個類能夠被多個線程安全的使用,必須在文檔中清楚的說明其支持的安全級別
  • 常見情形安全級別劃分:
    • 不可變:
      • 實例是不可變的,不須要外部的同步
      • 如:String、Long、BigInteger等
    • 無條件的線程安全:
      • 可變實例,內部擁有足夠的同步,無需任何外部同步
      • 如:Random、ConcurrentHashMap
        • ConcurrentHashMap是線程安全的,
          • 將Map 分紅16個segment,
          • 按照hash值對應key到某個segment
          • 每一個操做都是線程安全的
    • 有條件的線程安全:
    • 非線程安全:
      • 必須外部同步包圍每一個方法調用,才能正常使用
      • 好比:ArrayList、HashMap
    • 線程對立的
      • 這個類不能安全的被多個線程併發調用,即便全部方法都被外部同步
      • 出現這種問題的根源在於,沒有同步修改靜態變量

公有同步鎖、線程

  • 容許客戶端程序以原子形式執行一個方法調用序列
  • 好比ConcurrentHashMap

私有同步鎖對象

  • 客戶端沒法訪問鎖
  • 私有鎖對象只能用到無條件線程安全類上

總結::blog

  • synchronized 註釋與該類是否線程安全毫無關係
  • 無條件線程安全類,請使用私有鎖來代替同步的方法
  • 有條件的線程安全類,必須在文檔標明哪一個方法調用時須要外部同步
相關文章
相關標籤/搜索