如何测量Java中不受系统时钟变化影响的时间?

Poo*_*ool 3 java clock

我想测量Java中的经过时间.但是System.currentTimeMillis(),(我相信)的差异System.nanoTime()可以通过外部变化来改变,例如某人(或系统)改变系统时钟.

使用网络呼叫不是一种选择,因为它可能非常频繁且需要快速返回.

对此有一个共同的解决方案吗?

编辑

对不起,我应该详细说明原因.它不是要阻止恶意用户 - 就像客户端发起的空闲登出和常规客户端事件一样.

Ste*_*n C 5

我认为没有办法做到这一点.

当然没有办法做到这一点,不能被颠覆.从根本上说,您将受操作系统和JVM的支配,因为当前时间报告给Java应用程序的内容.可以修补其中任何一个或两个,以便Java代码最终获得伪造的时间戳值.您可以尝试防范此问题,但黑客需要做的就是修补您的应用以完全禁用许可证检查.

无论您是否使用Java,此"漏洞"都适用于此记录.


Cow*_*wan 5

这并没有真正回答你的问题,但是错误#6458294意味着在可能的情况下,Sun的nanoTime()实现将使用真正单调的机制(Linux上的CLOCK_MONOTONIC,Windows上的QueryPerformanceFrequency/QueryPerformanceCounter).只有当这些不可用时,它才会回归到易受系统时钟变化影响的机制.

如果您对正在运行的硬件有控制(或至少知识),并且可以确保这些时钟机制可用,那么您可能很幸运,nanoTime()也可以.

您可能还想阅读此博文,其中更详细地讨论了HotSpot-on-Windows案例.