两个线程生成的时间戳

时间:2011-11-24 23:20:31

标签: multithreading timestamp

我的代码中有两个帖子。一个线程是一个创建消息的生成器。在传输消息之前生成时间戳。另一个线程是接收来自多个客户端的回复。为每个回复创建一个时间戳。两个线程同时运行。

我发现接收器生成的时间戳早于生成器生成的时间戳。正确的顺序应该是接收器的时间戳晚于生成器的时间戳。

如果我为发生器线程赋予高优先级,则不会出现此问题。但这也会降低性能。

是否有其他方法可以保证订单的正确性和对性能的影响较小?感谢。

1 个答案:

答案 0 :(得分:0)

根据问题中的评论主题,这可能是优化器的影响。这实际上是设计中的一个问题 - 它假设生产者和消费者之间的时钟是共享的或紧密同步的。在您需要在多台计算机之间分配处理之前,这种假设似乎是合理的。

很少(如果有的话)时钟在不同的计算机之间紧密同步。用于同步计算机的常用算法是Network Time Protocol。您可以在局域网上实现非常接近毫秒的同步,但即使这样也很困难。

有两种解决方案可以解决这个问题。第一种方法是让生产者的时间戳通过客户端传递到接收者。如果接收器接收的时间戳早于当前时间的概念,则它只是将时间戳重置为当前时间。这种类型的归一化将允许关于时间是单调递增序列的假设继续保持。

另一个解决方案是禁用优化并希望问题消失。正如您所料,此解决方案的里程可能会有很大差异。

根据您尝试解决的问题,您可以在不同的线程之间提供自己的同步时钟。使用原子递增的数字而不是墙时间java.util.concurrent.atomic.AtomicInteger或其中一个亲属可用于提供每次生成消息时递增的单个数字。这允许生产者和接收者具有共享值以用作各种时钟。

在任何情况下,时钟都很难正确使用,尤其是出于同步目的。如果您能找到某种方法来从分布式系统中删除有关时间的假设,那么您的架构和解决方案将更具弹性且更具确定性。