天天看點

Java并發程式設計實戰--事實不可變對象

如果對象在釋出後不會被修改,那麼對于其他在沒有額外同步的情況下安全地通路這些對象的線程來說,安全釋出是足夠的。所有的安全釋出機制都能確定,當對象的引用對所有通路該對象的線程可見時,對象釋出時的狀态對于所有線程也将是可見的,并且如果對象狀态不會再改變,那麼就足以確定任何通路都是安全的。

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

在沒有額外的同步的情況下,任何線程都可以安全地使用被安全釋出的事實不可變對象。

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

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

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