使用waits / notifys / synchronization控制控制台sysout

时间:2012-01-06 06:23:06

标签: java multithreading console synchronization

好的家伙们看,这是一个简单的exame,我做了。我试图学习更好的同步,但我在这里有一个问题..几乎所有的时间我都得到我想要的控制台上的结果:

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 intel corei5

如果你们需要我的代码在这里,它的小,而不是大家伙..

http://pastebin.com/nLczry9R

只需要一个好的答案,为什么会这样,感谢很多人! 想要了解这一点,线程同步。 抱歉,我的英文不好,非常感谢。

1 个答案:

答案 0 :(得分:1)

为什么要同步这些方法?如果这样做,每次调用一个方法时,整个类都会被线程监视器阻塞(在wait()上)(因为Monitor属于Useless类)。在方法u1和u2中使用synchronize(b) { .... }。而“b”可能不一定是“静态的”。

请查看此enter link description here以获得更好的解释。

我认为你的问题是因为:

  1. b是静态的
  2. synchronized将方法转换为锁定(或监视器锁定)对象
  3. 你两次调用u.u2,但是第一次调用它会释放被阻塞到“无用”监视器上的所有线程。因此存在竞争条件,并且获胜的第一个线程可以是t2或t1
  4. 所以试着:

    1. 将b更改为非静态变量
    2. 使用synchronize(b){...}