Java内存模型与多线程

Java虚拟机基础知识汇总 (二),在此基础上,进一步介绍Java的内存模型及其和并发编程的关系。

在并发编程中,非常重要的两个问题是:

  • 线程间如何通信,通信是用于控制不同线程间信息交换的机制;
  • 线程间如何同步,同步是用于控制不同线程间操作发生相对顺序的机制。

在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递
线程之间同步常用的方式有:使用Synchromized关键字和使用锁机制(未完待续)。
线程间的通信和同步并不是独立存在的,而是相辅相成的。

1. 线程通信机制:共享内存和消息传递

1. 共享内存:共享内存是比较常见的线程通信机制,在共享内存的并发模型中,通常我们会设置一个共享变量,
允许多个线程都可以操作同一个共享变量,此时不同线程之间是没有直接联系的,而是通过共享变量来进行交互,
从而实现线程通信,但是这会涉及到共享变量的同步问题,同步是显示的,即需要程序员去控制。

2. 消息传递:与共享内存不同,在消息传递的并发模型中,不同线程之间是直接通信的,通过显式的发送消息来实现通信。这种模型稍微复杂些,但是,同步是隐式的,即对程序员是透明的。

两种线程通信机制的对比:

\通信同步
共享内存线程之间通过读-写内存中的公共状态进行隐式通信同步是显示进行的,程序员必须显示指定临界区
消息传递线程之间必须通过发送消息的方式来进行显式通信同步是隐式进行的,对程序员是透明的

2. Java内存模型

Java线程之间的通信由Java内存模型(Java Memory Model, JMM)控制,它采用的是共享内存的线程通信机制,
JMM定义了线程了主内存之间的抽象关系:
线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,用于存储该线程读/写的共享变量的副本,
不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

JMM抽象结构示意图如下:

这里写图片描述

如果线程A、B之间要通过共享变量进行通信的话,过程如下:

  • 线程A先把自己本地内存中修改后的共享变量的值刷新到主内存中;
  • 线程B再到主内存中读取线程A更新的共享变量的值。

3. JMM的三大特性

Java内存模型是围绕它的三大特性:原子性、可见性和有序性进行构建的。

  • 原子性:指一个操作要么全部执行、要么不执行,不可被中断。
  • 可见性:指当一个线程对共享变量做了修改之后,其他线程也能够立即获取到修改后的结果。
  • 有序性:指程序的执行顺序按照代码的先后顺序执行。

在多线程环境下,程序的执行顺序会因为“执行重排序”和“工作内存和主内存同步延迟”而出现“乱序”现象。
指令重排序:指编译器能够自由的以优化的名义去改变指令顺序,处理器处理器可能不会完全按照代码顺序执行指令。

参考链接:http://blog.csdn.net/wuliusir/article/details/46275263
参考书籍:《Java并发编程的艺术》,感谢作者~

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值