老师,问您一个多线程更新数据的问题

来源:7-6 日志到底该放在拦截器,还是过滤器中

奶茶三兄弟d

2020-11-12

多线程更新数据的问题,就是一个线程池中我要更新280W的数据,这个线程池固定是 10个线程,

然后每次一个线程执行 更新 500条数据, 那280W / 500 = 5600,然后 for循环5600次,

每次线程池提交一个线程任务,就是上面说的更新500条数据,然后现在存在的问题是由于多线程的环境,

多个线程可能在更新重复的数据,导致最后可能出现少更新了一些数据,按照正常理想的情况下,应该是第一个线程

更新500条数据,第二线程继续更新后面500条数据,以此类推,这样就不会出现漏更新的问题,但是这样不就是

等于排队了,那么用多线程就没意义了,老师有什么方案嘛

写回答

1回答

张勤一

2020-11-12

三兄弟你好:

    关于你所说的重复数据处理其实是个很简单的问题,问题的难点是对错误的处理。你可以思考 ConcurrentHashMap 的思想,为什么它的效率高呢,因为存在数据分段。那么,其实,你这里的数据就可以采用数据分段的思想:

    (1)每个线程处理 500 个数据,就把数据分成 total / 500 段(hash 取模就可以确定属于哪一段)

    (2)每一段数据都用线程池中的线程去处理,但是这里面在处理每一个 task 的时候,需要 try catch 并保存失败的 task

    (3)汇总失败的 task 并重试处理


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

2
2
张勤一
回复
奶茶三兄弟d
内存是你在启动 JVM 的时候设置的,不放在内存,从文件里读也是一样的操作过程
2020-11-12
共2条回复

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

466 学习 · 204 问题

查看课程