使用AtomicInteger、synchronized或LongAdder实现线程安全的任务计数器,结合场景选择方案:AtomicInteger适合简单增减,synchronized适用于复杂逻辑,LongAdder提升高并发性能,配合CountDownLatch可协调任务完成,确保多线程下状态一致。

在多线程环境下,任务计数器常用于统计正在执行、已完成或待处理的任务数量。若不加以同步控制,多个线程同时修改计数器会导致数据错乱。Java提供了多种方式实现线程安全的任务计数器,结合实际场景选择合适方案是关键。
使用 AtomicInteger 实现计数器
对于简单的递增、递减操作,AtomicInteger 是最轻量且高效的方案。它基于CAS(Compare and Swap)机制,避免了锁的开销。
示例:统计已完成任务数
private AtomicInteger completedTasks = new AtomicInteger(0);public void taskFinished() { completedTasks.incrementAndGet();}public int getCompletedCount() { return completedTasks.get();}
说明:incrementAndGet 是原子操作,适合高并发读写场景。适用于不需要复杂逻辑的计数需求。
立即学习“Java免费学习笔记(深入)”;
使用 synchronized 方法或代码块
当计数逻辑较复杂(如条件判断+更新),可使用 synchronized 保证方法或代码块的原子性。
private int runningTasks = 0;public synchronized void startTask() { runningTasks++;}public synchronized void finishTask() { runningTasks--;}public synchronized int getRunningCount() { return runningTasks;}
说明:synchronized 能确保同一时间只有一个线程进入方法。虽然性能略低于原子类,但在逻辑复杂时更安全易懂。
腾讯智影-AI数字人
基于AI数字人能力,实现7*24小时AI数字人直播带货,低成本实现直播业务快速增增,全天智能在线直播
73 查看详情
使用 LongAdder 提升高并发性能
在极端高并发场景下(如每秒数万次计数更新),LongAdder 比 AtomicInteger 性能更好。它通过分段累加减少竞争。
private LongAdder completedTasks = new LongAdder();public void taskFinished() { completedTasks.increment();}public long getCompletedCount() { return completedTasks.sum();}
说明:LongAdder 适合写远多于读的场景。读操作 sum() 相对较慢,但写操作并发性能优异。
结合线程池使用 CountDownLatch 或 CompletableFuture
任务计数器常与任务调度配合使用。例如,用 CountDownLatch 等待所有任务完成:
int taskCount = 100;CountDownLatch latch = new CountDownLatch(taskCount);for (int i = 0; i { try { // 执行任务 } finally { latch.countDown(); // 计数减一 } });}latch.await(); // 等待所有任务完成
说明:CountDownLatch 本身线程安全,适合做一次性任务协调。若需多次复用,可用 CyclicBarrier。
基本上就这些。根据并发强度和使用场景选择 AtomicInteger、synchronized 或 LongAdder,配合线程池工具能有效管理任务生命周期。关键是避免竞态条件,确保状态一致性。不复杂但容易忽略细节。
以上就是在Java中如何实现线程安全的任务计数器_任务计数器并发实践经验的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/301645.html
微信扫一扫
支付宝扫一扫