發佈和逸出
“發佈”一個對象的意思是指,是對象能夠在當前作用域之外的代碼中使用。當某個不該發佈的對象被髮布時,這種情況就被稱爲逸出。
線程封閉
當訪問共享的可變數據時,通常需要使用同步。一種避免使用同步的方式是不共享數據。如果僅在單線程內訪問數據,就不需要同步。這種技術就做線程封閉。
ad-hoc線程封閉:維護線程封閉性的職責完全由程序實現來承擔。
棧封閉:只能通過局部變量才能訪問對象。
不變性
滿足同步需求的另一種方法就是使用不可變對象。
如果某個對象在被創建以後其狀態就不能被修改,那麼這個對象就稱爲不可變對象。不可變對象一定是線程安全的。
對象不可變性不等於將對象中所有的域都聲明爲final類型,即是對象中所有的域都是final類型的,這個對象也仍然是可變的,因爲在final類型的域中可以保存對可變對象的引用。
對象不可變滿足:
- 對象創建以後其狀態就不能修改
- 對象的所有域都是final類型
- 對象是正確創建的(在對象的創建期間,this引用沒有逸出)
正如“除非需要更高的可見性,否則應將所有的域都聲明爲私有域是一個良好的習慣,”除非需要某個域可變,否則應將其聲明爲final域"也是一個良好的編程習慣