摘要:参考何去何从的并行计算忘记该死的并行并行程序的复杂性和乱序性,并行程序设计十分复杂。可怕的现实摩尔定律的失效单核上的晶体管数目达到极限。并发级别阻塞重入锁无饥饿两个线程优先级不同,低优先级的可能产生饥饿。
Chapter1
参考:
https://github.com/chengbingh...
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 同步异步
可以理解为,同步,一次方法调用,会等到返回结果了再继续执行,异步是方法调用后立即返回。
1.2.2 并发&并行
并发的最终效果和并行可能一样,区别在于,单核cpu,一次只能执行一个指令,只能是并发。
1.2.3临界区
在并行计算中,临界区的资源是保护对象,避免
1.2.4阻塞和非阻塞
同步和异步,阻塞和非阻塞区别
1.2.5 死锁、饥饿、活锁
死锁
synchronized 嵌套
lock 不释放锁
饥饿
一个线程无法获取资源,而一直无法执行。(比如线程优先级比较低)
活锁
两个线程,都将资源让给对方,此时,资源在线程间让来让去,那么两个线程都无法执行。
1.3.1 阻塞
synchronized
重入锁
1.3.2 无饥饿
两个线程优先级不同,低优先级的可能产生饥饿。
1.3.3无障碍
无障碍是大家都随意操作资源,一旦发现同时操作某个资源了,那么就回滚。 这个相对于悲观的阻塞,这个是乐观策略
1.3.3 无锁
不断尝试修改资源,可能无限循环,直到尝试修改资源成功
1.3.4 无等待
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编译器也会做指令重排序,即生成的机器指令与字节码指令顺序不一致。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71271.html
摘要:开始学习也有一段时间了,一些基础的书也扫了一遍了。最近慢慢开始看和,后者的话和有类似之处,都是一些编程经验的编程的世界里好多的东西都是相同的。这里其实是对的最佳实践,之后该对象已经变成一个过期的引用了,此时就应该清空这个引用。 开始学习java也有一段时间了,一些基础的书也扫了一遍了(think in java/core java volume 1)。最近慢慢开始看和,后者的话和有类似...
摘要:所以需要等来确保程序中隐蔽的错误没有提示的错误比如两个正数相加,溢出导致其值为负数。并发下的两个线程同时对一个对象,每个线程个对象,最终结果可能中有万个对象。可能对象个数少于万可能内部结构发生破坏,程序无法终止,会被大量消耗。 java并行程序基础 参考:https://github.com/chengbingh... 2.1 有关线程, 需要知道的事 进程是线程的容器线程状态图: s...
摘要:因此将变量存放于独立的缓存行中,也有助于变量在多线程访问是的性能提升实战高并发程序设计,大量的高并发库都会采用这种技术。 在Java程序中,多线程几乎已经无处不在。与单线程相比,多线程程序的设计和实现略微困难,但通过多线程,我们却可以获得多核CPU带来的性能飞跃,从这个角度说,多线程是一种值得尝试的技术。那么如何写出高效的多线程程序呢? 有关多线程的误区:线程越多,性能越好 不少初学者...
阅读 2928·2021-11-08 13:20
阅读 1010·2021-09-22 15:20
阅读 645·2019-08-30 15:53
阅读 1922·2019-08-30 15:43
阅读 1243·2019-08-29 17:21
阅读 520·2019-08-29 12:15
阅读 2342·2019-08-28 17:51
阅读 3102·2019-08-26 13:26