开始怀疑多线程的作用了……

来源:5-18 循环尝试,不释放CPU

林就远

2020-11-26

老师,您好,看了您的课之后,我最近在公司开始写了个有关线程的程序功能。

功能如下:主线程读取某张表有多少该待处理的记录,然后用到了ForkJoinPool,来进行将任务不断二分。我设置的需要二分的值是8个记录数。比如我主线程查找到数据库中待处理的数据是10(具体是多少条记录得看线上,这里只是举例),那么大于8,所以就要分为5,5用两个线程执行。考虑到线程安全问题,我又对线程要处理的任务加了ReentrantLock锁,将关键代码保证同步。使得这个线程处理完了下个线程才进来继续执行。并且为了使得任务执行完成之后再继续走主线程逻辑,我还用到了CountDownlatch工具。

感受:说实话,这个功能虽然不复杂,但是我确实挺满意的。因为我是第一次在项目中用到ForkJoinPool以及ReentrantLock和CountDownlatch这些看起来很“高端”的功能。

事故:领导看了之后,问了我一个问题,我的回答苍白无力。
问:既然你的线程池中的子线程是通过ReentrantLock来保证一个接一个顺序执行的,那为什么要用到多线程?和单线程相比有点在哪?为什么10条任务数,你要分两个线程,每个线程顺序去执行5条记录数,这和直接让主线程执行这10条有差别吗?
答:内心Os,其实我已经被领导说服了。

疑问:对啊,ReentrantLock锁既然保证了线程安全,让线程一个个顺序的执行,那么为什么还要多线程呢?
在我这个案例里是不是不适合用多线程实现这个功能?老师,如果你是我,你会怎么回答这个问题呢?
哎,突然觉得好无趣,想不通,是我这个案例不合适吗?我想了想,我这个案例确实有点不合适……
老师,我现在好迷茫,望解惑……

写回答

1回答

悟空

2020-11-26

如果每个任务的所有内容,都要被锁住,那么就不适用多线程,但是如果每个任务中,有50%可以并行,有50%需要用锁来串行,那么多线程就可以提高效率,如果每个任务之间都是独立的,那么就不需要加锁,并行就会快很多。

1
1
林就远
谢谢老师。有40%左右的逻辑是独立的,领导决定还是用回单线程。非常感谢老师您的回答
2020-11-27
共1条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程