System.currentTimeMillis在计时器逻辑中的陷阱

冷漠man

冷漠man

2026-08-04

210人浏览

原创

system.currenttimemillis() 不适合计时器逻辑,因其是易受系统时间调整影响的挂钟而非单调时钟,会导致负耗时、精度不足(10–15ms)、跨线程/节点时钟不同步等问题;应依场景选用 system.nanotime()(相对耗时)、instant.now()(绝对时刻)等替代方案。

system.currenttimemillis在计时器逻辑中的陷阱

System.currentTimeMillis() 不适合用在计时器逻辑中——它不是秒表,而是挂钟。一旦系统时间被手动调整或 NTP 自动校正,计时器就可能跳变、倒退甚至失效。

它会“倒流”,导致负耗时

计时器依赖“后减前”算差值,但 currentTimeMillis() 返回的是系统挂钟时间,受外部干预影响:

  • 用户手动把系统时间往回调,比如从 14:30 改成 14:20,两次调用可能返回 1718720000000 → 1718719400000,差值为负
  • NTP 同步时若发生大幅回拨(如修正 500ms 偏差),也会触发同样问题
  • 日志里出现 “耗时: -127ms” 就是典型信号,说明计时逻辑已被破坏

精度不足,短间隔测不准

多数操作系统对 currentTimeMillis() 的实际分辨率只有 10–15ms:

  • 想控制 300ms 防抖,但连续两次调用可能返回相同毫秒值,导致 duration = 0
  • 在 Windows 上尤其明显,旧版本默认精度约 15.6ms,根本无法支撑亚百毫秒级判断
  • 看似“已过 250ms”,实际可能只过了 10ms,也可能卡在 0ms,结果不可靠

跨线程/跨节点时钟不同步

计时器若涉及多线程协作或分布式协调,问题更突出:

  • 多个线程共用一个 start 时间戳,但各自调用 currentTimeMillis() 获取的 end 值可能来自不同步的 CPU 核心或虚拟机时钟
  • 容器环境、云主机常因 vCPU 暂停、热迁移导致本地时钟漂移,两台机器差值失真
  • HTTP 超时判断若依赖服务端 currentTimeMillis() 减去客户端发包时间,网络延迟和时钟偏差会让阈值形同虚设

正确替代方案:按场景选 API

计时器逻辑必须区分“何时触发”和“持续多久”:

  • 做超时等待、防抖、倒计时 → 用 System.nanoTime():单调、高精度、不受系统调时影响,适合计算相对经过时间
  • 调度任务到某个绝对时刻(如“明天 9 点执行”)→ 用 Instant.now() 或 LocalDateTime.now().atZone(ZoneId.systemDefault()),再转为调度框架可识别的时间点
  • 需要兼顾精度与可观测性(如链路追踪中的 span 时间)→ 用 nanoTime() 记录起止,再用 currentTimeMillis() 打上 wall-clock 时间戳作参考
  • 高频循环内需反复判断是否超时 → 提前缓存 nanoTime() 起点,避免每次调用开销;别在循环里反复调用 currentTimeMillis()
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
li是什么元素
li是什么元素

li是HTML标记语言中的一个元素,用于创建列表。li代表列表项,它是ul或ol的子元素,li标签的作用是定义列表中的每个项目。本专题为大家li元素相关的各种文章、以及下载和课程。

2023.08.03

596

5

火山引擎API Key获取教程
火山引擎API Key获取教程

火山引擎API Key适合需要调用火山引擎云服务、AI模型、火山方舟接口或其他开放能力的开发者参考。本专题整理控制台入口、账号认证、服务开通、API Key创建、密钥复制保存、权限检查、调用测试和Key无效等常见问题排查。

2026.08.04

1

10

火山引擎API接入教程
火山引擎API接入教程

火山引擎API接入适合需要在应用、脚本、后台服务或AI工具中调用火山引擎能力的开发者参考。本专题整理控制台入口、服务开通、API Key获取、接口地址配置、请求参数填写、调用测试、权限设置、额度查询和常见接口报错排查。

2026.08.04

3

10

火山引擎DeepSeek API调用教程
火山引擎DeepSeek API调用教程

火山引擎DeepSeek API适合需要在应用、脚本、智能体或AI编程工具中调用DeepSeek模型的开发者参考。本专题整理火山引擎控制台入口、模型服务开通、API Key获取、Base URL配置、模型名称填写、调用测试、额度查询和常见接口报错排查。

2026.08.04

2

10

火山引擎控制台操作教程
火山引擎控制台操作教程

火山引擎控制台中常用功能包括API密钥管理、模型调用配置、云资源查看、账单明细、用量统计和权限分配。本专题整理控制台基础操作、服务开通流程、Key创建与保存、费用消耗查看、子账号权限设置和调用失败排查,方便开发者完成日常管理。

2026.08.04

3

10

PDF与PPT格式转换操作方法及在线转换技巧
PDF与PPT格式转换操作方法及在线转换技巧

本专题聚焦 PDF 与 PPT 文件格式转换需求,整理 PDF 转 PPT 在线转换方法、PPT 批量转换 PDF 操作步骤、转换后格式错乱处理以及文档版式检查技巧。通过详细教程帮助用户掌握 PDF、PPT 双向转换方法,解决演示文稿制作、文件整理和办公格式转换中的常见问题,提高办公效率。

2026.07.31

112

6

PDF合并文件操作方法与在线批量合并技巧
PDF合并文件操作方法与在线批量合并技巧

本专题聚焦 PDF 文件合并与文档整理需求,整理多个 PDF 合并成一个文件、图片批量转换 PDF、合同附件合并发送以及在线 PDF 合并操作方法等实用教程。通过详细步骤介绍 PDF 合并流程、文件顺序检查技巧和免费在线合并方案,帮助用户快速整理零散文档,提高办公文件处理效率。

2026.07.31

88

8

PDF转Word在线转换与文档编辑处理方法
PDF转Word在线转换与文档编辑处理方法

本专题聚焦 PDF 转 Word 文件转换与办公文档处理需求,整理 PDF 在线转换成 Word、PDF 转可编辑 Word、PDF 文件格式转换操作步骤以及转换后版式错乱、图片无法编辑等常见问题解决方法。通过详细教程帮助用户快速掌握 PDF 转 Word 技巧,提高办公文件处理效率。

2026.07.31

89

5

CodeIgniter下载教程
CodeIgniter下载教程

本合集由PHP中文网精心整理,为您提供CodeIgniter下载教程与官方正版下载安装指南。内容涵盖CI3/CI4官方获取渠道、Composer依赖安装及环境配置全流程。助您安全、高效地搭建轻量级PHP框架,轻松开启Web应用开发之旅。

2026.07.30

116

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习