如何多线程更新同一张表?

发布于 2022-03-10 16:21:22 字数 131 浏览 833 评论 5

比如有10个线程,线程1更新0~100,线程2更新100~200,线程3更新200~300。
我自己写的,发现总有跳过中间的行为,比如200~300没更新,更新到后面去了。
如何保证整个表全部更新过去呢?
这个有什么思路吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

本宫微胖 2022-03-11 06:53:48

public class ThreadTest {
    
    public static void main(String[] args) throws InterruptedException {
        //数据---我只使用3个线程
        ConcurrentSkipListMap<Integer, Integer> map = new ConcurrentSkipListMap<>();
        for (int i = 0; i < 300; i++) {
            map.put(i+1, i+1);
        }
        
        CountDownLatch latch = new CountDownLatch(1);        //门闩
        
        new Thread(() ->{
            map.forEach((k, v) ->{
                if(v <= 100) {
                    map.put(k, v+1);
                    System.out.println(Thread.currentThread().getName() + "111111,原始数据 key=" + k + ", value=" + v);
                }else {
                    try {
                        latch.await();  //阻塞当前线程,直到计数器的值为0
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }, "thread-1").start();
        
        new Thread(() ->{
            map.forEach((k, v) ->{
                if(v > 100 && v <= 200) {
                    latch.countDown();  //当前线程调用此方法,则计数减一
                    map.put(k, v+1);
                    System.out.println(Thread.currentThread().getName() + "222222,原始数据 key=" + k + ", value=" + v);
                }else {
                    try {
                        latch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }, "thread-2").start();
        
        new Thread(() ->{
            map.forEach((k, v) ->{
                if(v > 200) {
                    latch.countDown();  //当前线程调用此方法,则计数减一
                    map.put(k, v+1);
                    System.out.println(Thread.currentThread().getName() + "333333,原始数据 key=" + k + ", value=" + v);
                }
            });
        }, "thread-3").start();
        
        TimeUnit.MILLISECONDS.sleep(2);
        
        map.forEach((k , v) ->{
            System.out.println("修改之后的数据  " + k + "," + v);
        });
        
    }
}

该方法不一定是最优的,你可以进行更改,也可以只参考

囚你心 2022-03-11 06:47:01

1. 用in语句还是 >200 and <300操作的sql语句

一个人的旅程 2022-03-11 06:26:31

打开数据库日志, 日志里面都有记录

只为守护你 2022-03-11 05:49:08

多线程更新表没问题,你首先应该先确认你获取到的数据对不对,你的200-300这个数据如果获取没问题,我相信应该问题也不大

路还长,别太狂 2022-03-11 02:56:46

说明 你获取的列表 数据 不固定

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文