天天看點

初涉java多線程(二)

原文:[url]http://huagenli.iteye.com/blog/511414[/url] 最後的代碼如下:

并且在最後提出了問題:

這段代碼的共享成員是一個類中的靜态成員,按理說,這裡進入共享代碼時得到的鎖應該是同樣的鎖,而實際上以上程式的輸入卻是不同步的,為什麼呢??

...按理說,這裡進入共享代碼時得到的鎖應該是同樣的鎖...這句話說得太隐晦,是說到得是同一把鎖,還是說得到得都是對象鎖? 剛學java同步兩周,我大膽的來解決最後的問題:

synchronized(YourClassName.class ):目前線程得到的是YourClassName的Class鎖,那麼在目前線程釋放此Class鎖之前,别的線程沒有機會通路YourClassName裡的一切。

我翻閱了幾本書,沒有得到以下明文,下面是我的[b]推斷[/b]:

synchronized(private static 執行個體變量):目前線程得到的是通路private static 執行個體變量的對象的鎖。是以thread1、thread2得到的是不同的對象鎖。假設thread1運作到最後代碼中的16行,此時得到的是對象一的鎖,然後程式改變了szShareData的引用(引用了别的位址),接着小睡片刻; thread2搶占時間片,執行到16行,得到對象二的鎖,改變了szShareData的引用,小睡片刻;thread1搶占時間片(這是假設,thread1有可能在N個時間片後執行),執行輸出結果,其實輸出的是thread2改變後的szShareData,這樣就出現了紊亂。如果觀察的不是很明顯,可以把sleep改成這樣:Thread.sleep(2)。

改正:把synchronized(private static 執行個體變量)改成synchronized(YourClassName.class );或者把方法(裡面對static執行個體變量通路)改寫成public static synchronized的,這樣獲得的鎖與synchronized(YourClassName.class )獲得的是[b]同一把鎖[/b]。^..^ Thread.sleep(2)期間線程不會釋放鎖。

結論:synchronized(private static 執行個體變量):目前線程得到的是通路private static 執行個體變量的對象的鎖。