java-concurrent
java高并发编程
你应该先了解这些
*1.线程的概念
线程:本人通俗理解一个程序里头不同的执行路径可以放在不同的cpu里面同步运行
*2.如何启动一个线程
*3.基本的线程同步
并行流水线
并发算法虽然可以发挥多核CPU的性能.但是很不幸的是,并非所有的计算都可以改造成并发的形式.
那么什么样的算法是无法使用并发进行计算的呢?简单来说,执行过程中有数据相关的运算都是无法完美并行化的
假如我们要计算(B+C)*B/2,如果B+C没有执行完成,则永远算不出(B+C)*B,这就是数据相关性.如果线程执行时,所需的数据存在这种依赖关系,
那么就没办法将他们完美的并行化,如果遇到这种情况有没有什么补救措施呢.答案肯定是有的,那就是借鉴日常生产中的流水线思想
比如,现在要生产一批小玩偶。小玩偶的制作分为四个步骤
第一要组装身体.
第二要在身体上安装四肢和头部.
第三给组装完成的玩偶穿上一件漂亮的衣服.
第四就可以包装出货了。
为了加快制作玩具的进度,我们不可能叫四个人同时加工一个玩具,因为这四个步骤有着严重的依赖关系。
如果没有身体,就没有地方安装四肢,如果没有组装完成,就不能穿衣服,如果没有穿上衣服,就不能包装发货。因此,找四个人来做一个玩偶是毫无意义的。
但是,如果你现在要制作的不是1只玩偶,而是1万只玩偶,那情况就不同了。你可以找四个人,第一个人只负责组装身体,
完成后交给第二个人: 第二个人只负责安装头部和四肢,交付第三人: 第三人只负责穿衣服,
并交付第四人: 第四人只负责包装发货。这样所有人都可以一一起工作,共同完成任务,而整个时间周期也能缩短到原来的1/4 左右,
这就是流水线的思想。一旦流水线满载,每次只需要一步(假设一个玩偶需要四步) 就可以产生一个玩偶
看代码com.test.concurrent
并行搜索
搜索几乎每一个软件都必不可少的功能.对于有序数据,通常可以采用二分法查找.对于无序数据,则只能挨个查找.
给定一个数组,我们要查找满足条件的元素,对于串行程序来说,只要遍历一下数组就可以得到结果.但是如果要使用并行的方式,
则需要增加一些线程间的通信机制,使各个线程可以有效地运行.
看代码com.test.concurrent1并行搜索