線程安全
線程安全的對象具有在上面線程安全一節中描述的屬性 由類的規格說明所規定的約束在對象被多個線程訪問時仍然有效不管運行時環境如何排列線程都不需要任何額外的同步這種線程安全性保證是很嚴格的 許多類如 Hashtable 或者 Vector 都不能滿足這種嚴格的定義
有條件的線程安全
我們在 月份的文件 並發集合類中討論了有條件的線程安全有條件的線程安全類對於單獨的操作可以是線程安全的但是某些操作序列可能需要外部同步條件線程安全的最常見的例子是遍歷由 Hashtable 或者 Vector 或者返回的迭代器 由這些類返回的 failfast 迭代器假定在迭代器進行遍歷的時候底層集合不會有變化為了保證其他線程不會在遍歷的時候改變集合進行迭代的線程應該確保它是獨占性地訪問集合以實現遍歷的完整性通常獨占性的訪問是由對鎖的同步保證的 並且類的文檔應該說明是哪個鎖(通常是對象的內部監視器(intrinsic monitor))
如果對一個有條件線程安全類進行記錄那麼您應該不僅要記錄它是有條件線程安全的而且還要記錄必須防止哪些操作序列的並發訪問用戶可以合理地假設其他操作序列不需要任何額外的同步
線程兼容
線程兼容類不是線程安全的但是可以通過正確使用同步而在並發環境中安全地使用這可能意味著用一個 synchronized 塊包圍每一個方法調用或者創建一個包裝器對象其中每一個方法都是同步的(就像 CollectionssynchronizedList() 一樣)也可能意味著用 synchronized 塊包圍某些操作序列為了最大程度地利用線程兼容類如果所有調用都使用同一個塊那麼就不應該要求調用者對該塊同步這樣做會使線程兼容的對象作為變量實例包含在其他線程安全的對象中從而可以利用其所有者對象的同步
許多常見的類是線程兼容的如集合類 ArrayList 和 HashMap javatextSimpleDateFormat 或者 JDBC 類 Connection 和 ResultSet
線程對立
線程對立類是那些不管是否調用了外部同步都不能在並發使用時安全地呈現的類線程對立很少見當類修改靜態數據而靜態數據會影響在其他線程中執行的其他類的行為這時通常會出現線程對立線程對立類的一個例子是調用 SystemsetOut() 的類
其他線程安全記錄考慮
線程安全類(以及線程安全性程度更低的的類) 可以允許或者不允許調用者鎖定對象以進行獨占性訪問 Hashtable 類對所有的同步使用對象的內部監視器但是 ConcurrentHashMap 類不是這樣事實上沒有辦法鎖定一個 ConcurrentHashMap 對象以進行獨占性訪問除了記錄線程安全程序還應該記錄是否某些鎖 如對象的內部鎖 對類的行為有特殊的意義
通過將類記錄為線程安全的(假設它確實 是線程安全的)您就提供了兩種有價值的服務您告知類的維護者不要進行會影響其線程安全性的修改或者擴展您還告知類的用戶使用它時可以不使用外部同步通過將類記錄為線程兼容或者有條件線程安全的您就告知了用戶這個類可以通過正確使用同步而安全地在多線程中使用通過將類記錄為線程對立的您就告知用戶即使使用了外部同步他們也不能在多線程中安全地使用這個類不管是哪種情況您都在潛在的嚴重問題出現 之前防止了它們而要查找和修復這些問題是很昂貴的
結束語
一個類的線程安全行為是其規格說明中的固有部分應該成為其文檔的一部分因為(還)沒有描述類的線程安全行為的聲明式方式所以必須用文字描述雖然 Bloch 的描述類的線程安全程度的五層系統沒有涵蓋所有可能的情況但是它是一個很好的起點如果每一個類都將這種線程行為的程度加入到其 Javadoc 中那麼可以肯定的是我們大家都會受益
[] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27775.html