将Java虚拟机与System.nanoTime同步

jea*_*ean 2 java synchronization nanotime

将java虚拟机与System.nanoTime()同步是否有意义?

我的意思是 :

  • 调用System.nanoTime()并将结果放入t1
  • A向B发送数据包
  • 当在B上收到来自A的数据包时,B调用System.nanoTime()并将结果发送给A.
  • 当在A上接收到来自B的数据包时,A调用System.nanoTime()并将结果放入t3,将来自B的数据包中接收的时间放在t2中
  • timeshift =(t3-t1)/ 2-t2

使用System.nanoTime来做到这一点是正确的吗?

谢谢 !

Mat*_*all 8

使用System.nanoTime来做到这一点是正确的吗?

No. System.nanoTime()仅用于测量单个JVM中的时间差异,而不是跨多个JVM的绝对时间.

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关.返回的值表示纳秒,因为某些固定但任意的原始时间(可能在将来,因此值可能为负).在Java虚拟机的实例中,此方法的所有调用都使用相同的原点; 其他虚拟机实例可能使用不同的来源.

要解决这个问题,通常你会使用System.currentTimeMillis(),但这仍然受到两台计算机的OS时钟的限制.使用NTP在计算机之间同步时间.

请参阅使用Java服务器和Internet之间的时间同步.