从5个方面让你真正了解Java内存模型( 二 )


JMM抽象示意图:

从5个方面让你真正了解Java内存模型

文章插图
 
从上图可以看出每个线程都有一个本地内存,如果线程想要通信的话要执行一下步骤:
  • A线程先把本地内存的值写入主内存
  • B线程从主内存中去读取出A线程写的值
具体通信规则可以参考我上一篇文章:Java内存模型里面定义了八种通信规则 。
到这里就对JMM有个清晰的理解了 。JMM其实是一种规范,其主要目的就是为了解决多线程通过共享内存进行通信时所产生的本地内存数据不一致,编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题 。
解决的问题JMM所解决的问题离不开我们上面所说的三大特性:可见性、原子性、有序性.
原子性:在java中使用synchronized关键字保证代码的原子性 。
可见性:volatile关键字保证了多线程操控变量的可见性,同时synchronized和final也可以保证变量的可见性,注意:volatile并不保证原子性,所以什么时候用volatile一定要注意 。
有序性:volatile可以禁用指令重排,synchronized关键字保证同一时刻只允许一条线程操作所以我们可以发现synchronized可以解决三种问题,所以使用synchronized关键字比较多,但是synchronized只允许一个线程进行操作,会造成上下文切换的效率问题 。
最后欢迎大家一起交流,喜欢文章记得关注我点赞转发哟,感谢支持!




推荐阅读