您的位置:首页 > 编程语言 > Java开发

Java内存模型总结-基本概念

2018-02-08 10:32 134 查看
JMM控制主内存与每个线程的本地内存的交互,保证java程序的内存可见性
1、重排序(只针对单处理器和单线程)
编译器优化重排序
处理器重排序:要求Java编译器生成指令序列时,插入特定类型的内存屏障指令,禁止特性类型的处理器重排序。
2、happens-before
happens-before并不意味着前一个的操作必须在后一个操作之前完成,仅仅要求前一个操作的操作结果对后一个操作可见,且前一个操作按顺序排在后一个操作之前。
程序顺序规则
监视器锁规则
volatile变量规则
4)传递性
3、重排序
重排序指编译器和处理器为了优化程序性能而对指令序列重新进行排序。
4、as-if-serial
无论怎样重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能改变。
在多线程中,对存在控制依赖的操作重排序,可能会导致执行结果发生变化。

5、顺序一致性模型
顺序一致性模型保证单线程操作按照程序顺序执行(JMM不能保证单线程操作按照顺序执行,在临界区内可能会发生指令重排序)
保证所有线程只能看到一致的操作执行顺序(JMM中会先保存到本地内存中,最后再写到主内存)
6、总线工作机制
数据通过总线在内存与处理器之间传递。内存和处理器之间的数据传递需要一系列的操作,这些操作称为总线事务。总线事务分为读/写事务。读事务是从内存读取事务到处理器,写事务是通过总线将处理器中的数据写到内存。一个线程在执行总线事务期间,总线会禁止其他线程访问内存。保证多线程时总线的串行访问,单个总线事务之中的内存读写具有原子性。
7、JMM不保证long和double型变量写操作的原子性
JVM在32位上的处理器上运行时,64位的long和double的写操作可能会分为两个32位的写操作来执行。而且这两个32位的写操作可能会被分配到不同的事务总线上去执行,此时对64位变量的写操作不具有原子性。
从JSR-133内存模型开始(JDK5),仅仅只允许把一个64位的long/double型变量的写操作分为32位写操作来执行,读操作必须保证其原子性。

【参考资料】《JAVA并发编程的艺术》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: