【问题标题】:Controlling console sysout with waits/notifys/synchronization使用等待/通知/同步控制控制台 sysout
【发布时间】:2012-01-06 06:23:06
【问题描述】:

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

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

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

http://pastebin.com/nLczry9R

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

【问题讨论】:

    标签: java multithreading console synchronization


    【解决方案1】:

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

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

    我认为你的问题是因为:

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

    所以尝试:

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

    【讨论】:

    • 感谢您的帮助,但我无法在布尔值上同步,我猜.. 给了我错误。然后我改成非静态的,然后尝试几乎同时运行两次程序。在第二个程序上,我遇到了同样的问题,就像 1/10 次一样
    • 您收到什么错误?尝试使用对象 Bool 而不是原始类型 boolean...
    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2017-01-05
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2023-01-10
    相关资源
    最近更新 更多