Java,线程示例,使其更好地同步

时间:2012-12-05 15:03:18

标签: java multithreading

我一直在学习Java(Oracle Press Books),我正在学习线程。这些例子与本书略有不同。到目前为止,这是可以理解的。然而这最新的一个看起来有点奇怪。以下是代码:http://pastebin.com/tu0qajMF

程序演示了线程之间与wait()和notify()的通信。它有一个对象,有两个同步方法tick和tock。他们只是显示滴答声和嘀嗒声。在运行示例时,它应该是“Tick Tock Tick Tock ...”它通常会这样做。但有时候它会变成“Tock Tick Tock Tick。”

为什么要这样做?

如何更改代码却不会?

2 个答案:

答案 0 :(得分:3)

在线程启动之前,你没有进行任何预同步,所以这是一个关于谁先运行的竞赛。在第一次连接之前,您不会进入同步点,因此此时两个线程中的任何一个都可能已启动。

答案 1 :(得分:0)

我通过添加一些预同步来解决这个问题,我在离开潜意识大约十五分钟后发现了一种方法,在Facebook上发布了一些帖子,然后一个想法来到我身边。它比我想象的要简单得多。

在TickTock类中,我添加了一个成员“boolean virginity = true”,如果处女为真,则让Tock等待,并且在运行时将Tick设置为false。因此,当MyThread运行时,Tick总是首先运行 - 因为两个线程共享的对象都有一个变量,可以确保Tock等待Tick并且没有竞争。

此处代码:http://pastebin.com/AHCvcNa8

如果没有回答我的第一个问题,我就无法解决这个问题,所以,谢谢,首先回答问题回答者。