博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程工作内存与主内存变量交换过程及volatile关键字理解
阅读量:5060 次
发布时间:2019-06-12

本文共 648 字,大约阅读时间需要 2 分钟。

Java线程工作内存与主内存变量交换过程及volatile关键字理解

1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。此处的所谓内存模型要区别于通常所说的虚拟机堆模型:

2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示:

原子操作的规则(部分):

1) read,load必须连续执行,但是不保证原子性。

2) store,write必须连续执行,但是不保证原子性。

3) 不能丢失变量最后一次assign操作的副本,即遍历最后一次assign的副本必须要回写到MainMemory中。

其它规则详见《深入理解Java虚拟机》第12章 Java内存模型与线程

3. volatile关键字

定义为volatile类型的变量拥有两种语义:

1) 变量的修改对所有线程可见

理解:

  线程中每次use变量时,都需要连续执行read->load->use几项操作,即所谓的每次使用都要从主内存更新变量值,这样其它线程的修改对该线程就是可见的。

  线程每次assign变量时,都需要连续执行assign->store->write几项操作,即所谓每次更新完后都会回写到主内存,这样使得其它线程读到的都是最新数据。

2)禁止指令重排

 

参考:

《深入理解Java虚拟机》第12章 Java内存模型与线程

 

转载于:https://www.cnblogs.com/wrencai/p/5704331.html

你可能感兴趣的文章
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
【贪心+DFS】D. Field expansion
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>
iOS基础-UIKit框架-多控制器管理-实例:qq界面框架
查看>>
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>