gpt4 book ai didi

java - 通过等待/通知/同步控制控制台系统输出

转载 作者:行者123 更新时间:2023-12-01 15:36:36 27 4
gpt4 key购买 nike

好吧,大家看,这是我做的一个简单的考试。我正在尝试学习更好的同步,但我这里有一个问题..几乎每次我都会在控制台上得到我想要的结果:

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个核心?我有 Windows 7 intel corei5

如果你们需要我的代码,就在这里,它很小,不适合大人..

http://pastebin.com/nLczry9R

只需要一个好的答案,为什么会发生这种情况,非常感谢大家!想多了解一点,线程同步。抱歉我的英语不好,提前非常感谢。

最佳答案

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

看看这个enter link description here以获得更好的解释。

我认为你的问题是因为:

  1. b 是静态的
  2. 同步是在方法上而不是在锁(或监视器锁)对象上
  3. 您调用 u.u2 两次,但第一次调用它会释放所有阻塞在“无用”监视器上的线程。因此存在竞争条件,第一个获胜的线程可能是 t2 或 t1

所以尝试:

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

关于java - 通过等待/通知/同步控制控制台系统输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com