第55章(1 / 1)

大B:“在多線程模式下,惰性初始化會使多個線程同時初始化該單體,造成一個JVM中多個單例類型的實例,如果這個單例類型的成員變量在運行過程中發生變化,會造成多個單例類型實例的不一致。”

小A:“那應該怎麼辦?”

大B:“加個同步修飾符:publicstaticsynchronizedSingletongetInstance。這樣就保證了線程的安全性。這種處理方式雖然引入了同步代碼,但是因為這段同步代碼隻會在最開始的時候執行一次或多次,所以對整個係統的性能不會有影響。”

小A:“在更新屬性的時候,會造成屬性的讀寫不一致。那應該怎麼處理?”

大B:“1、讀者/寫者的處理方式。設置一個讀計數器,每次讀取信息前,將計數器加1,讀完後將計數器減1。使用notifyAll解除在該對象上調用wait的線程阻塞狀態。隻有在讀計數器為0時,才能更新數據,同時調用wait方法要阻塞所有讀屬性的調用。2、采用‘影子實例’的辦法。具體說,就是在更新屬性時,直接生成另一個單例對象實例,這個新生成的單例對象實例將從數據庫,文件或程序中讀取最新的信息;然後將這些信息直接賦值給舊單例對象的屬性。”

小A:“嘿嘿!師兄,能不能舉例來看一下啊?”

大B:“好的。”

例子:

wait;

wait;

(本章完)