老师,问您一个多线程更新数据的问题
来源:7-6 日志到底该放在拦截器,还是过滤器中
奶茶三兄弟d
2020-11-12
多线程更新数据的问题,就是一个线程池中我要更新280W的数据,这个线程池固定是 10个线程,
然后每次一个线程执行 更新 500条数据, 那280W / 500 = 5600,然后 for循环5600次,
每次线程池提交一个线程任务,就是上面说的更新500条数据,然后现在存在的问题是由于多线程的环境,
多个线程可能在更新重复的数据,导致最后可能出现少更新了一些数据,按照正常理想的情况下,应该是第一个线程
更新500条数据,第二线程继续更新后面500条数据,以此类推,这样就不会出现漏更新的问题,但是这样不就是
等于排队了,那么用多线程就没意义了,老师有什么方案嘛
写回答
1回答
-
三兄弟你好:
关于你所说的重复数据处理其实是个很简单的问题,问题的难点是对错误的处理。你可以思考 ConcurrentHashMap 的思想,为什么它的效率高呢,因为存在数据分段。那么,其实,你这里的数据就可以采用数据分段的思想:
(1)每个线程处理 500 个数据,就把数据分成 total / 500 段(hash 取模就可以确定属于哪一段)
(2)每一段数据都用线程池中的线程去处理,但是这里面在处理每一个 task 的时候,需要 try catch 并保存失败的 task
(3)汇总失败的 task 并重试处理
我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!
222020-11-12
相似问题