1.java并发编程的线程间通信及线程间如何同步
线程间通信分为:共享内存,消息传递。
线程间同步:共享内存是代码指定的显示同步,消息传递是先发送后接收的隐式同步。
java采用共享内存,显示同步。
2.java内存模型抽象--JMM
线程A 线程A本地内存 (可以是缓冲区)
主内存(堆内存--实例对象、静态域、数组元素)
线程B 线程B本地内存 (可以是缓冲区)
本地内存是JMM抽象概念
不用线程的通信要通过线程刷新变量到主内存中,其他线程从主内存拉取实现线程间共享。
3.重排序
java代码-->1.编译器优化排序-->2.cpu指令级并行重排序-->3.内存系统重排序-->最终执行的指令
编译器会优化指令顺序,处理器会IPL指令级并行技术重排序,内存由于使用缓存及读/写缓冲区看起来重排指令。
解决办法:java编译器在生成指令时加入内存屏障,禁止某些指令重排序。
4.内存屏障分类
LoadLoad 示例:load1 ;LoadLoad;load2 。 load1加载先于load2及后边指令
StoreStore sotre1指令刷新到主内存,先于store2及后指令
LoadStore load1先于store2及后指令
StoreLoad store1刷新到内存,保证屏障前所有指令都完成后才执行屏障后指令。级别最高。消耗最大,需要将缓冲区中数据全部刷新到主内存中。
5.happens-before简介
一个操作需要对另一个操作可见,即是happens-before关系。
网友评论