查看原文
其他

死磕Java并发:Java内存模型之总结

chenssy 程序猿DD 2019-07-13

本文转载自公众号: Java技术驿站


经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结。


1、总结


JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。

一方面,要为程序员提供足够强的内存可见性保证;

另一方面,对编译器和处理器的限制要尽可能地放松。

JMM对程序员屏蔽了CPU以及OS内存的使用问题,能够使程序在不同的CPU和OS内存上都能够达到预期的效果。


Java采用内存共享的模式来实现线程之间的通信。编译器和处理器可以对程序进行重排序优化处理,但是需要遵守一些规则,不能随意重排序。


  • 原子性:一个操作或者多个操作要么全部执行要么全部不执行;

  • 可见性:当多个线程同时访问一个共享变量时,如果其中某个线程更改了该共享变量,其他线程应该可以立刻看到这个改变;

  • 有序性:程序的执行要按照代码的先后顺序执行;


在并发编程模式中,势必会遇到上面三个概念,JMM对原子性并没有提供确切的解决方案,但是JMM解决了可见性和有序性,至于原子性则需要通过锁或者Synchronized来解决了。


如果一个操作A的操作结果需要对操作B可见,那么我们就认为操作A和操作B之间存在happens-before关系,即A happens-before B。


happens-before原则是JMM中非常重要的一个原则,它是判断数据是否存在竞争、线程是否安全的主要依据。依靠这个原则,我们可以解决在并发环境下两个操作之间是否存在冲突的所有问题。JMM规定,两个操作存在happens-before关系并不一定要A操作先于B操作执行,只要A操作的结果对B操作可见即可。


在程序运行过程中,为了执行的效率,编译器和处理器是可以对程序进行一定的重排序,但是他们必须要满足两个条件:1 执行的结果保持不变,2 存在数据依赖的不能重排序。重排序是引起多线程不安全的一个重要因素。


同时顺序一致性是一个比较理想化的参考模型,它为我们提供了强大而又有力的内存可见性保证,他主要有两个特征:

1、一个线程中的所有操作必须按照程序的顺序来执行;

2、所有线程都只能看到一个单一的操作执行顺序,在顺序一致性模型中,每个操作都必须原则执行且立刻对所有线程可见。


2、博文列表(可点击阅读)


  1. 【死磕Java并发】—–Java内存模型之happens-before

  2. 【死磕Java并发】—–Java内存模型之重排序

  3. 【死磕Java并发】—–Java内存模型之分析volatile

  4. 【死磕Java并发】—–Java内存模型之从JMM角度分析DCL


3、Java内存模型推荐资料


  1. 程晓明:深入Java内存模型

  2. 周志明:深入理解Java虚拟机-第五部分 高效并发

  3. Java 并发编程:volatile的使用及其原理

  4. Java并发编程:volatile关键字解析

  5. 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型

  6. 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理

  7. 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障

  8. 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则

  9. happens-before俗解


- END -


最后福利提醒

价值999元的明基WiT ScreenBar,昨晚23点开奖,中奖者是Michael,恭喜啦~奖品会在近日寄出,请耐心等待。



也感谢549位粉丝的参与,看来大家对ScreenBar还是蛮感兴趣的。没中奖的朋友,也可以直接扫下面的二维码购买,优先享受减免200元的粉丝福利。


也可点击以下链接

看看我对这款ScreenBar的使用体验情况

👇

加班的你,需要一束光

 往期推荐:

  • 死磕Java系列:


  1. 深入分析ThreadLocal

  2. 深入分析synchronized的实现原理

  3. 深入分析volatile的实现原理

  4. Java内存模型之happens-before

  5. Java内存模型之重排序

  6. Java内存模型之分析volatile

  ……


  • Spring系列:

  1. Spring Cloud Zuul中使用Swagger汇总API接口文档

  2. Spring Cloud Config Server迁移节点或容器化带来的问题

  3. Spring Cloud Config对特殊字符加密的处理

  4. Spring Boot使用@Async实现异步调用:使用Future以及定义超时

  5. Spring Cloud构建微服务架构:分布式配置中心(加密解密)

  6. Spring Boot快速开发利器:Spring Boot CLI

……

号外:

最近在做几个有意思的开源项目,感兴趣的朋友可以看看。

地址:

https://github.com/dyc87112/swagger-butler

可关注我的公众号

深入交流、更多福利

扫码加入我的知识星球


点击“阅读原文”,看本号其他精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存