我正在使用所有其他对象都可以看到的带螺纹的“时钟”。每个对应于时钟滴答的时间段,时钟都会增加一个计数器。然后它将为其他类提供一个公共方法来读取当前时间。 1个滴答代表5秒的模拟时间,但仅需1秒。这是到目前为止我实现的:
public class Clock extends Thread
{
private int seconds = 0;
public void run()
{
//sleep 1000 mil secs
this.seconds += 5;
}
}
我想收到有关该方法的一些反馈,该方法可以将当前时间提供给其他课程。这是到目前为止我在另一个将使用该方法的类上所做的示例:
public class Entry extends Thread
{
Clock c;
public Entry(Clock clock)
{
c = clock;
}
答案 0 :(得分:0)
使seconds
字段volatile
(这是您可以使用的最基本的最小同步原语)。原因是编译器可能将此字段缓存在本地寄存器中,而另一个读取此变量的线程可能会读取过时的值。
这是为什么需要同步的一个很好的例子。即使只有并发读取而没有并发写入,您的状态也是如此。
编辑:正如其他人提到的那样,您的设计很糟糕。
答案 1 :(得分:0)
这种设计可能很好,或者可能被破坏了,但这全都取决于我们在这里看不到的细节,包括您的其余代码以及您要实现的目标。
我会考虑:
volatile
或在synchronized
块中进行访问(例如synchronized
getter方法)Clock.run
乘以5,而不是在“ System.currenttimeMillis()
”内部进行旋转,但这取决于您要实现的目标我不认为这个问题真正适用于Stackoverflow-尚无一个正确答案。
我认为您的代码是一个不错的开始。为什么不尝试这种方法,看看您的生活如何,然后根据您的经验进行更新?通过这样做,您可能会比尝试在此处进行设计更快。