线程之间的通信和同步

线程之间的通信和同步是并发编程领域的关键问题。

线程之间的通信

通信是指线程之间以何种机制来交换信息。线程之间的通信一般有两种方式:共享内存和消息传递。在java中典型的消息传递方式就是wait()和notify()。

线程之间的同步

同步是指程序用于控制不同线程之间操作发生相对顺序的机制。

在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行,如加锁和CAS。

在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

java内存模型的抽象结构

工作内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。工作内存主要是为了解决CPU和内存之间的运算能力相差甚远的问题。它和现代计算机的内存结构很相似,如图:

现代的处理器使用写缓冲区临时保存向内存写入的数据。写缓冲区可以保证指令流水线 持续运行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。同时,通过以 批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一内存地址的多次写,减少对内存总 线的占用。但是它存在一个问题:处理器对内存的读/写操作的执行 顺序,不一定与内存实际发生的读/写操作顺序一致,这个问题在java内存模型中也存在。为了具体说明,请看下面的表:

a和b的初始值为0。处理器A和处理器B同时将,参数a和b加载到高速缓存,处理器A执行a=1;x=b;、处理器B执行b=2;y=a。这时A处理器中的b=0,B处理器中的a=0,所以最后得到的结果就是x=y=0。

Java内存模型的实现

在JVM内部,Java内存模型把内存分成了两部分:线程栈区和堆区。

JVM中运行的每个线程都拥有自己的线程栈,线程栈包含了当前线程执行的方法调用相关信息和所有局部变量,我们也把它称作调用栈。一个线程只能读取自己的线程栈,也就是说,线程中的本地变量对其它线程是不可见的。即使两个线程执行的是同一段代码,它们也会各自在自己的线程栈中创建局部变量,因此,每个线程中的局部变量都会有自己的版本。

堆中的对象可以被多线程共享。如果一个线程获得一个对象的应用,它便可访问这个对象的成员变量。如果两个线程同时修改这个成员编码,那么就会引发并发问题,如图的Object3。

Java内存模型带来的问题

  1. 共享对象对各个线程的可见性
  2. 共享对象的竞争现象

java批处理_Java内存模型你应该知道相关推荐

  1. JAVA基础驿站,Java基础:内存模型

    在java基础当中,有很重要一块的内容,就是关于java当中的内存模型,所涉及的问题无非就是关于java当中的类.实例.变量.常量.静态变量.方法等blabla的东西都分别存储在什么地方.这部分的内容 ...

  2. java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  3. 学习笔记【Java 虚拟机④】内存模型

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  4. java happens before_java内存模型以及happens-before规则

    原创文章&经验总结&从校招到A厂一路阳光一路沧桑 image# 1. JMM的介绍 # 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程 ...

  5. java 排序 内存_Java内存模型(二)——重排序

    一.重排序 重排序是指为了提高程序的执行效率,编译器和处理器常常会对语句的执行顺序或者指令的执行顺序进行重排. 编译器优化的重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序. ...

  6. java内存规范_Java内存模型-jsr133规范介绍

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  7. java线程的内存模型_java多线程内存模型

    java多线程内存模型: 可见性 要实现共享变量的可见性,必须保证两点: 1.线程修改后的共享变量能够及时从工作内存刷新到主内存中: 2.其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存 ...

  8. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  9. java 内存屏障类型_Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物理内存的一小部分 2.JAVA ...

最新文章

  1. 中小型金融企业该如何进行灾备建设?
  2. 郑宇、沈抖领衔共话 AI 业界应用挑战 | IJCAI 2019
  3. 2015.1.3 让CombBox自动弹出下拉框
  4. 美国税局再遭攻击:原是偷来的社会安全号码作祟
  5. web农行支付php示例,ecshop,shopex完美实现农业银行(农行)在线支付接口
  6. Scala的sealed关键字
  7. 最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决
  8. [转]XCode调试 设置全局断点并快速定位问题代码所在行
  9. 什么是计算机病毒?是怎么产生的?
  10. Edison 蓝牙模块 学习笔记
  11. 智力题解题报告 No.4 9个点10个线
  12. mac分区合并APFS容器
  13. 由pushViewController说起可能出线的各种死法
  14. 大数据核心技术有哪些 怎么样学好大数据开发
  15. 认知升级:什么才是真正的高情商?
  16. 内存卡android文件夹名称,安卓手机内存卡文件夹英文名称解析——第三方应用类...
  17. (Linux)进程间通信
  18. 英语口语九十九之每日十句口语
  19. ChromeOptions--禁止加载图片
  20. gtbook安装使用教程

热门文章

  1. 让普通用户可以kill自己用户下的session(转)
  2. JZOJ 3503. 粉刷(paint)
  3. SSLOJ 1335.蛋糕切割
  4. 超越村后端开发(7:修改完善代码(持续更新))
  5. 线程间通信 1全局变量2当前主对话框指针3发消息方式4 AfxBeginThread的返回值(为CWinThread类型的指针)5AfxGetApp...
  6. 项目经理的职责 |项目经理做些什么工作
  7. Visual SourceSafe使用流程指南
  8. webservice项目部署部署到weblogic报错之解决方案
  9. 如何检查字符串是否包含特定的单词? [英]How do I check if a string contains a specific word?
  10. eclipse导入jar包的三种方法