3.4不可變性
不可變對象,對象創建後,其狀態就不可改變,狀態指,成員變量的值。
滿足以下條件的對象纔是不可變對象:
1、對象的所有成員對象都是final
2、對象被正確的創建
3.4.1、對象的域(成員變量)儘量聲明爲final,會減少對象的可變狀態。
除非需要可變,否則所有域(成員變量)都聲明爲final,爲好的編程習慣。
3.4.2、用volatile來發布不可變對象
3.5安全發佈
發佈:多個線程共享對象的某個或某幾個成員變量
3.5.1、不正確的發佈,可以導致某個成員對象還沒有被創建完成,就被其他線程直接拿來用。
3.5.2、java內存模型爲final不可變對象提供了一種安全的初始化模型。
多個線程任何線程都可以安全的共同訪問不可變對象以及可變對象的不可變成員變量。
3.5.3安全的發佈對象(將對象置爲public)
1、將對象初始化放入static修飾的作用域中。
2、將對象用final、volitile、AtmoicRefer修飾
3、用鎖保護
4、將對象放入容器中
3.5.4 如果一個對象時可變的,但程序運行過程中不會改變,那麼他可以成爲事實上的不可變對象。
3.5.5 可變對象的安全,分爲初始化安全,和使用過程中的安全。
發佈:對象初始化。
多線程安全初始化對象的方法:
1、在靜態函數中初始化
2、將對象的引用用volitile和atmoicRefer修飾
3、將對象的引用用final修飾。
4、對象的引用保存到一個由鎖保護的地方。
共享對象的一些實用策略:
1、線程封閉,對象只由1個線程使用。
2、只讀共享,對象或對象的所有狀態是final的。
3、鎖保護
4、線程安全共享,對象的內部對象爲private,暴露public函數,同步在對象的內部實現。多個線程由對象的公共接口訪問該對象。