2012-01-06 52 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