Multithreading 由两个线程生成的时间戳

Multithreading 由两个线程生成的时间戳,multithreading,timestamp,Multithreading,Timestamp,我的代码中有两个线程。一个线程是创建消息的生成器。在发送消息之前生成时间戳。另一个线程是一个接收器,它接受来自多个客户端的回复。为每个回复创建一个时间戳。两个线程同时运行 我发现接收方生成的时间戳早于生成器生成的时间戳。正确的顺序应该是接收器的时间戳晚于生成器的时间戳 如果我为生成器线程提供高优先级,则不会出现此问题。但这也会降低性能 是否有其他方法来保证正确的顺序和对性能影响较小?谢谢。根据问题中的评论线索,这可能是优化器的作用。这实际上是设计的一个问题,而不是其他任何问题——它假设生产者和消

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

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

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


是否有其他方法来保证正确的顺序和对性能影响较小?谢谢。

根据问题中的评论线索,这可能是优化器的作用。这实际上是设计的一个问题,而不是其他任何问题——它假设生产者和消费者之间的时钟是共享的或紧密同步的。在您需要在多台计算机之间分配处理之前,此假设似乎是合理的

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

这个问题有两种解决办法。第一种方法是让生产者的时间戳通过客户端传递到接收方。如果接收器接收到的时间戳早于其当前时间的概念,那么它只是将时间戳重置为当前时间。这种规格化将允许关于时间是单调递增序列的假设继续成立

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

根据您试图解决的问题,您可能能够在不同线程之间提供自己的同步时钟。使用原子递增的数字,而不是墙时间
java.util.concurrent.AtomicInteger
或其一个相关项可用于提供单个数字,该数字在每次生成消息时递增。这允许生产者和接受者有一个共享的值,用作排序时钟


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

这类问题通常很大程度上取决于编程语言和操作系统。你使用什么编程语言,在什么操作系统下工作?我使用Java并在Windows XP上运行如果生产者时间戳存储在消息中,生产者和消费者时间戳以相同的方式生成,并且两次都在消费者处读取/显示,我能看到这种情况发生的唯一方式是如果时间在倒流。你在做中微子实验吗?@MartinJames-如果消息在小于时钟分辨率的时间段内排队和退队,或者由JVM优化器生成时间戳并在声明点之前缓存,则可能发生这种情况。