JMM抽象示意图:
文章插图
从上图可以看出每个线程都有一个本地内存,如果线程想要通信的话要执行一下步骤:
- A线程先把本地内存的值写入主内存
- B线程从主内存中去读取出A线程写的值
到这里就对JMM有个清晰的理解了 。JMM其实是一种规范,其主要目的就是为了解决多线程通过共享内存进行通信时所产生的本地内存数据不一致,编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题 。
解决的问题JMM所解决的问题离不开我们上面所说的三大特性:可见性、原子性、有序性.
原子性:在java中使用synchronized关键字保证代码的原子性 。
可见性:volatile关键字保证了多线程操控变量的可见性,同时synchronized和final也可以保证变量的可见性,注意:volatile并不保证原子性,所以什么时候用volatile一定要注意 。
有序性:volatile可以禁用指令重排,synchronized关键字保证同一时刻只允许一条线程操作所以我们可以发现synchronized可以解决三种问题,所以使用synchronized关键字比较多,但是synchronized只允许一个线程进行操作,会造成上下文切换的效率问题 。
最后欢迎大家一起交流,喜欢文章记得关注我点赞转发哟,感谢支持!
推荐阅读
- Centos7下FastDFS从安装到入门
- 饵料|春季钓鱼调整这几方面,口口是顿口;这样钓草,飞鱼上岸防挂底
- 如何提高员工幸福感?这5个要素缺一不可 如何提高员工幸福感
- 我们怎样才能把普洱茶做好这三个方面需要得到很好的控制
- 如何挑选金桔
- 从茶席开始 告别美盲
- 绝对经典,看了必会 linux中部署mysql主从同步示例详解
- 从古代到现代茶的艺术知道多少
- 茶有五个方面我们鼓励您热爱茶
- 从装置到茶叶了解生活的美学