回覆列表
-
1 # 星辰大洋
-
2 # 李昂35
程式碼沒發全。但是還是可以猜一下,我猜account是這個類的一個普通成員變數。你new了三個這個類的instance,所以在記憶體裡有三個account被三個thread操作,即使你sync這個類的class,也不會起作用。兩個基本解決方案:1,把account宣告成static。 2,把這個類從繼承thread變成實現runnable,在main方法裡只new一個這個類的例項,併發的thred都用這一個例項。
還有很多Java的獨有的辦法解決這個問題,例如: 用atomicinteger來做account,就不需要sync了
題主沒有給出完整程式碼和執行結果,我分析這段程式碼是沒有問題的,可以正確執行。
這段程式碼裡,使用了SaveMoney類物件的鎖,這個物件在執行時有且只有一個例項,這就保證了這段程式碼在執行時,同時只能有一個執行緒獲得鎖,其他的執行緒都要等待鎖持有執行緒釋放鎖之後才能進入。所以題主需要補充一下,鎖不住這個結論時怎麼得出的。
我還原了這段程式碼,並給出執行結果如下:
執行程式碼,應該與題主的一致
執行結果表明,三個執行緒互斥執行同步程式碼塊。