System.currentTimeMillis()无频率限制,因本质是轻量级读取系统时钟,但精度受限于OS时钟粒度(Windows约10–16ms,Linux约1–10ms),连续调用易返回重复值,高精度场景应改用System.nanoTime()或Instant.now()。

System.currentTimeMillis() 没有频率限制,可高频调用,但精度受系统时钟影响。
为什么没有调用频率限制
该方法本质是读取操作系统提供的当前时间(通常来自内核的单调时钟或实时钟),不涉及网络请求、磁盘 I/O 或锁竞争,属于轻量级本地操作。JVM 对它做了高度优化,多次连续调用(如每微秒一次)在技术上完全可行,不会抛异常或被限流。
实际精度远低于纳秒级
虽然返回值是毫秒级 long 值,但底层系统时钟更新频率有限:
- Windows 默认时钟粒度约 10–16 毫秒(取决于系统设置和硬件)
- Linux 通常为 1–10 毫秒,可通过
clock_getres(CLOCK_MONOTONIC, &res)查看 - 连续多次调用可能返回相同值(尤其在循环中密集调用时)
高频调用的注意事项
不是不能调,而是需注意效果是否符合预期:
- 别用它做高精度计时(如性能微基准),应改用
System.nanoTime() - 避免在 tight loop 中反复调用并期望毫秒级变化——很可能得到一串重复值
- 若需唯一时间标识(如生成 ID),不要单靠 currentTimeMillis(),应结合序列号或随机数防碰撞
替代方案参考
根据场景选择更合适的工具:
- 测代码执行耗时 →
System.nanoTime() - 记录业务事件时间(带时区/可读性)→
Instant.now() - 需要更高精度时间戳 → 使用 JEP 389 引入的
Foreign Function & Memory API调用高精度系统时钟(需自行封装)

















