关于JMM(Java Memory Model)Java内存模型的总结

Why?为什么要有Java内存模型

为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程读写操作行为规范。通过这些规则来规范内存的读写操作,从而保证指令执行的正确性。

它与处理器、缓存、并发、编译器都有关系,解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性、有序性;

 

What?Java内存模型是什么

Java内存模型就是一种符合内存规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果的一致性机制及规范。

总结来讲,JMM其实是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题,目的是保证并发编程场景中的原子性、可见性和有序性。

另外Java内存模型,除了定义了一套规范,还有提供了一系列的原语例如Synchronize、Volatile、final、concurren、automic等,封装了底层实现后供开发者直接使用。

 

1、原子性

monitorentor、monitorexit,这两个字节码在Java的对应关键字就是Synchronize,因此在Java中用这个关键字来保证代码块和方法内的操作是原子性的;

2、可见性

Java内存模型是通过变量修改后同步回主内存,在变量读取前从主内存刷新变量值的这种一来内存作为传递媒介的方式来实现的,

volatile关键字提供了一个功能就是被修饰的变量在被修改后可以立即同步到主内存,并且其修饰的变量在每次用之前都在主内存刷新一下再进行同步到工作内存,因此大部分情况下都是用volatile用来保证多线程操作时变量的可见性,当然final、synchronize在一定的条件下也可以,不展开讨论这里;

3、有序性

在Java中,可以使用synchronized和volatile来保证线程之间操作的有序性,实现方式有所区别:

volatile关键字会禁止指令重排,synchronized关键字保证同一时刻只允许一条线程操作。

 

好了大家到这里可能会发现,synchronize是万能的,三种都可以满足,这也是很多人滥用schronize的原因,用synchronize是比较影响性能的,虽然JIT提供了很多锁优化技术,但是也不建议过度使用。

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/a517690655/article/details/82905858
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞