Java併發程式設計實戰--事實不可變物件

衣舞晨風發表於2017-05-24

如果物件在釋出後不會被修改,那麼對於其他在沒有額外同步的情況下安全地訪問這些物件的執行緒來說,安全釋出是足夠的。所有的安全釋出機制都能確保,當物件的引用對所有訪問該物件的執行緒可見時,物件釋出時的狀態對於所有執行緒也將是可見的,並且如果物件狀態不會再改變,那麼就足以確保任何訪問都是安全的。

如果物件從技術上來看是可變的,但其狀態在釋出後不會再改變,那麼把這種物件稱為“事實不可變物件(Effectively Immutable Object)”。這些物件不需要滿足之前提出的不可變性的嚴格定義。在這些物件釋出後,程式只需將它們視為不可變物件即可。通過使用事實不可變物件,不僅可以簡化開發過程,而且還能由於減少了同步而提高效能。

在沒有額外的同步的情況下,任何執行緒都可以安全地使用被安全釋出的事實不可變物件。

例如,Date本身是可變的,但如果將它作為不可變物件來使用,那麼在多個執行緒之間共享Date物件時,就可以省去對鎖的使用。假設需要維護一個Map物件,其中儲存了每位使用者的最近登入時間:

public Map<String, Date> lastLogin =Collections.synchronizedMap(new HashMap<String, Date>());

如果Date物件的值在被放入Map後就不會改變,那麼synchronizedMap中的同步機制就足以使Date值被安全地釋出,並且在訪問這些Date值時不需要額外的同步。

java併發程式設計實戰pdf及案例原始碼下載:
http://download.csdn.net/detail/xunzaosiyecao/9851028

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章