Chapter1

参考:
https://github.com/chengbingh...

1.1何去何从的并行计算

1.1.1 忘记该死的并行
并行程序的复杂性和乱序性,并行程序设计十分复杂。
linus:并行程序有两个应用场景
一个是图形处理领域,比如一个1000万像素的图片,用for循环遍历十分耗时。
一个是服务端编程,比如淘宝双十一

并行程序的使用的两个考量:
一个是功能上的,比如jvm 除了main线程还有jit即时编译,gc垃圾回收线程,业务模型的需要,需要多个执行实体。
一个是性能上,获得更好的性能。

1.1.2可怕的现实:摩尔定律的失效
单核cpu, 上的晶体管数目达到极限。

1.1.3 柳暗花明:不断前进
单核cpu===>多核cpu

1.1.4 光明或黑暗
唐纳德:摩尔定律的维持由硬件工程师维持,变成软件工程师来维持。

1.2 必须知道的概念

1.2.1 同步异步
可以理解为,同步,一次方法调用,会等到返回结果了再继续执行,异步是方法调用后立即返回。

1.2.2 并发&并行
并发的最终效果和并行可能一样,区别在于,单核cpu,一次只能执行一个指令,只能是并发。
1.2.3临界区

clipboard.png

在并行计算中,临界区的资源是保护对象,避免
1.2.4阻塞和非阻塞

clipboard.png

同步和异步,阻塞和非阻塞区别

clipboard.png

clipboard.png

1.2.5 死锁、饥饿、活锁
死锁
synchronized 嵌套
lock 不释放锁
饥饿
一个线程无法获取资源,而一直无法执行。(比如线程优先级比较低)
活锁
两个线程,都将资源让给对方,此时,资源在线程间让来让去,那么两个线程都无法执行。

1.3并发级别

1.3.1 阻塞
synchronized
重入锁
1.3.2 无饥饿
两个线程优先级不同,低优先级的可能产生饥饿。
1.3.3无障碍
无障碍是大家都随意操作资源,一旦发现同时操作某个资源了,那么就回滚。 这个相对于悲观的阻塞,这个是乐观策略

clipboard.png

clipboard.png

1.3.3 无锁
不断尝试修改资源,可能无限循环,直到尝试修改资源成功

1.3.4 无等待

clipboard.png

1.4 并行的两个定律

随着cpu 个数提高,我们可以不断提高运行速度,但是还是有限制的。

1.5 java 内存模型(JMM)

1.5.1 原子性
原子性指的是一个操作在执行过程中不能被中断。
中断的例子:在一个32位的虚拟机中, 每次从内存中操作的大小都是32位的, 现在两个线程同时给一个64为的long型变量赋值。 一个赋值为1亿,一个赋值为2亿, 最终赋值的结果可能既不是1亿,也不是2亿。而是一个莫名其妙的数字。
valiate 关键字可以避免这个情况

1.5.2 可见性
一个线程修改了共享变量的值,其它的线程能否立知道这个改变。
cpu优化:
并发情况下, 可能是一个cpu1 修改一个变量后,将它放到缓存cache中,这时另外一cpu2中的线程修改了这个共享变量,它也放到缓存中cache中, 这样cpu1里的线程由于还是从缓存中取,所以不知道这个修改。
硬件优化
有些内存读写会放到一个硬件的队列中,不会立即操作。
指令重排
1.5.3 有序性
处理器cpu 出现指令重排
常见的Java运行时环境的JIT编译器也会做指令重排序,即生成的机器指令与字节码指令顺序不一致。


dhxx
37 声望19 粉丝

中间件相关