java-实战java高并发程序设计-ch1走入并行的世界

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java-实战java高并发程序设计-ch1走入并行的世界脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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临界区

java-实战java高并发程序设计-ch1走入并行的世界

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

java-实战java高并发程序设计-ch1走入并行的世界

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

java-实战java高并发程序设计-ch1走入并行的世界

java-实战java高并发程序设计-ch1走入并行的世界

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

1.3并发级别

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

java-实战java高并发程序设计-ch1走入并行的世界

java-实战java高并发程序设计-ch1走入并行的世界

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

1.3.4 无等待

java-实战java高并发程序设计-ch1走入并行的世界

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编译器也会做指令重排序,即生成的机器指令与字节码指令顺序不一致。

脚本宝典总结

以上是脚本宝典为你收集整理的java-实战java高并发程序设计-ch1走入并行的世界全部内容,希望文章能够帮你解决java-实战java高并发程序设计-ch1走入并行的世界所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。