2012-01-06 51 views
0

好吧,大家看,我做了一個簡單的外部測試。我想學習更好的同步,但我有一個問題在這裏..幾乎所有的時候,我得到了我想要在控制檯上的結果是:用等待/ notifys /同步來控制控制檯sysout

Here they go!...2001ms 
Mares eat oats - t1 3001ms 
Mares eat oats - t2 4001ms 
Does eat oats - t1 5001ms 
Does eat oats - t2 6001ms 

,但有時不...我得到這樣的:

Here they go!...2000ms 
Mares eat oats - t2 3000ms 
Does eat oats - t2 3000ms 
Mares eat oats - t1 4000ms 
Does eat oats - t1 6001ms 

有人能解釋我嗎?也許是因爲我有2個核心?我有窗口7英特爾corei5

,如果你們需要我在這裏的代碼它,它的小,沒有大的傢伙..

http://pastebin.com/nLczry9R

只需要一個很好的答案,爲什麼會出現這種情況,非常感謝夥計們! 想多瞭解一點,線程同步。 抱歉我的英語不好,非常感謝。

回答

1

爲什麼要同步這些方法?如果你這樣做,每次調用一個方法時,整個類都被阻塞(等待()到線程監視器上)(因爲監視器是無用類的)。在方法u1和u2中使用代替synchronize(b) { .... }。而「b」可能不一定是「靜態的」。

請看這enter link description here爲更好的解釋。

我覺得你的問題是因爲:

  1. b爲靜態
  2. 同步到是方法,而不是到鎖(或監視器鎖定)對象
  3. 你叫u.u2兩次,但第一次調用它可以釋放所有阻塞在「無用」監視器上的線程。因此,有一個競爭條件和獲得可能是T2和T1

所以儘量第一線:

  1. 變動b不靜態變量
  2. 使用同步(B){.. 。}
+0

感謝您的幫助隊友,但我不能在布爾同步,我想..給我錯誤。 和我變成不是靜態的,然後試着在幾乎同一時間運行該程序兩次..和第二個程序我得到相同的問題,如在1/10時間 – TiagoM 2012-01-06 16:26:43

+0

,但我想這可能是正常的,謝謝你提前;) – TiagoM 2012-01-06 16:29:10

+0

你收到什麼錯誤?嘗試使用對象Bool而不是原始類型布爾值... – robob 2012-01-07 06:15:00