當一個類的實例或者靜態方法被併發使用的時候,這個類的行爲如何,安全
- 是該類與客戶端程序的行爲約束
- 若是文檔中沒有相關描述,那麼可能致使未同步或過分同步的狀況
並非說文檔中出現Synchronized 就說明是線程安全併發
線程安全是分多種級別的:dom
- 一個類能夠被多個線程安全的使用,必須在文檔中清楚的說明其支持的安全級別
- 常見情形安全級別劃分:
- 不可變:
- 實例是不可變的,不須要外部的同步
- 如:String、Long、BigInteger等
- 無條件的線程安全:
- 可變實例,內部擁有足夠的同步,無需任何外部同步
- 如:Random、ConcurrentHashMap
- ConcurrentHashMap是線程安全的,
- 將Map 分紅16個segment,
- 按照hash值對應key到某個segment
- 每一個操做都是線程安全的
- 有條件的線程安全:
- 非線程安全:
- 必須外部同步包圍每一個方法調用,才能正常使用
- 好比:ArrayList、HashMap
- 線程對立的
- 這個類不能安全的被多個線程併發調用,即便全部方法都被外部同步
- 出現這種問題的根源在於,沒有同步修改靜態變量
公有同步鎖、線程
- 容許客戶端程序以原子形式執行一個方法調用序列
- 好比ConcurrentHashMap
私有同步鎖對象
- 客戶端沒法訪問鎖
- 私有鎖對象只能用到無條件線程安全類上
總結::blog
- synchronized 註釋與該類是否線程安全毫無關係
- 無條件線程安全類,請使用私有鎖來代替同步的方法
- 有條件的線程安全類,必須在文檔標明哪一個方法調用時須要外部同步