来看看某位同学的代码。各位能找出多少问题点?很经典

其中list有几十万条数据

public void saveData(Auth auth, List<DataCenterTag> list) {
        //启动多线程,一次200条纪录
        int size = list.size() / AMOUNT;
        if (size == 0) {
            saveList(auth, list);
            return;
        }
        CountDownLatch latch = new CountDownLatch(size);
        ExecutorService service = Executors.newFixedThreadPool(size);
        for (int i = 0; i < size; i++) {
            List<DataCenterTag> executeList = list.subList(i * AMOUNT, (i + 1) * AMOUNT);
            service.submit(() -> {
                try {
                    saveList(auth, executeList);
                } finally {
                    latch.countDown();
                }
            });
        }
        saveList(auth, list.subList(size * AMOUNT, list.size()));
        try {
            latch.await();
        } catch (InterruptedException e) {
            log.error("标签导入线程池中断异常");
        }
        service.shutdown();
    }

1.怎么开启那么多线程,上下文切换还不搞死
2.subList 保存了父类的副本,内存也要崩溃

subList 可能有坑的地方

  1. 修改子类的subList父类被修改
  2. 父类修改,子类遍历异常
  3. 不能强转为ArrayList等

1、第20行
saveList(auth, list.subList(size * AMOUNT, list.size()));
当list.size被AMOUNT整除时,这一行截取到的list大小为0
2、latch.await();最好设置超时时间,否则可能会产生死锁的可能