并发算法虽然可以充分发挥多核CPU的性能,但并非所有的计算都可以改成并发的形式,在执行过程中有数据相关性的运算都是无法完美并行化的。比如有2个数A和B,如果要计算(A+B)*A/2,这个运行过程是无法并行化的。如果A+B没有执行完,则永远算不出(A+B)*A,这就是数据相关性,如果线程执行时,所需数据存在这样的依赖关系,则无法将它们完美的并行化。
如何解决这种情况呢?方式是借鉴流水线思想。即使(A+B)*A/2无法并行,但如果你需要计算一大堆A和B的值,依然可以将它流水化。首先将计算过程拆分:
P1:C=A+B
P2:D=C*A
P3:D=D/2
步骤P1,P2,P3均在单独的线程中计算,并且每个线程只负责自己的工作,此时P3的计算结果就是最终答案。
--参考文献《实战Java高并发程序设计》
网友评论