第十二章 Java内存模型与线程
- Java内存模型(Java Memory Model,JMM):
- 主内存与工作内存:Java内存模型主要是定义程序中各个变量的访问规则。Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程
还有自己的工作内存(Working Memory),线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进
行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成,线程、主内存、
工作内存关系如下:
- 内存间交互操作:
8种操作:
1.lock(锁定):作用于主内存的变量,它把一个变量标识标识为一条线程独占的状态。
2.unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定。
3.read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
4.load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
5.use(使用):作用于工作内存的变量,它把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用
到变量的值的字节码指令时将会执行这个操作。
6.assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给
变量赋值的字节码指令时执行这个操作。
7.store(存储):作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便随后的write操作使用。
8.write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量值放入主内存的变量中。
操作规则:
1.不允许read和load、store和write操作之一单独出现。
2.不允许线程丢弃它最近的assign操作。
3.不允许线程无原因地把线程的工作内存同步回主内存中。
4.新变量只能在主内存中产生。
5.只能有一个线程在同一时刻执行lock操作。
6.lock时会清空工作内存中该变量副本的值。
7.unlock必须成对出现。
8.unlock会同步回主内存。 - valatile:Java虚拟机最轻量级的同步机制,1.保证此变量对所有线程的可见性。2.禁止指令重排序优化。
- 原子性、可见性、有序性。
- 先行发生原则:1.程序次序规则(Program Order Rule) 2.管程锁定规则(Monitor Lock Rule) 3.volatile变量规则(volatile variable rule)
4.线程启动规则(thread start rule) 5.线程终止规则(thread termination rule) 6.线程中断规则(thread interruption rule)
7.对象终结规则(finalizer rule) 8.传递性(transitivity) - Java与线程:
- 线程的实现:1.使用内核线程实现 2.使用用户线程实现 3.使用用户线程加轻量级进程混合实现
- Java线程调度:线程调度是指系统为线程分配处理器使用权的过程,有两种:1.协同式(Cooperative) 2.抢占式(Preemptive)
- 状态转换:java定义了5种线程状态:1.新建(New)2.运行(Runable) 3.等待(Waiting) 4.阻塞(Blocked) 5.结束(Terminated)
第十二章 Java内存模型与线程的更多相关文章
- 第十二章 Java内存模型与线程(待续)
············
- 深入理解java虚拟机-第12章Java内存模型与线程
第12章 Java内存模型与线程 Java内存模型 主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ...
- 《Java并发编程实战》第十六章 Java内存模型 读书笔记
Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...
- java并发编程实战:第十六章----Java内存模型
一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...
- 《深入理解Java虚拟机》-----第12章 Java内存模型与线程
概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ...
- 第12章 Java内存模型与线程
参考<深入理解Java虚拟机> 一.Java内存模型 1.Java内存模型 2.内存间交互操作 流程图: 3.volatile关键字 两个特性: 3.1.保证变脸对所有线程的可见性: 由 ...
- 第十六章 Java内存模型(待续)
········
- Java并发程序设计(三) Java内存模型和线程安全
Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗? 二.有序性 Java代 ...
- JVM(7) Java内存模型与线程
衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而 TPS 值与程序的并发能力又有非常 ...
随机推荐
- Podfile
platform :ios, "9.0" target "APPName" dopod 'AFNetworking'pod 'SVProgressHUD'pod ...
- es6 this指向
在非箭头函数中,谁调用的函数,this指向就是谁: var obj={ fn:function(){ console.log(this); } } obj.fn();//object 如果this出现 ...
- Mawawa CSS 学习之旅 Display
CSS 类型之 Display 更新时间: 2018-2-10: 一个良好的布局结构从 display 开始! 分类:外部值.内部值.列表值.属性值.混合值.显示值.全局值: 一.外部值 作用:主要用 ...
- java面试题03
1.一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?这个是可以的,一个“.java” ...
- sdk(输入驱动物体 驱动属性 被驱动物体 被驱动属性 驱动数值 一键搞定驱动),当你的目标体很多展开会卡的时候使用这个
import maya.cmds as mc def sdksomething( sdk_obj="", sdkAttr=" ...
- vim的学习
vi和vim的关系: vim是vi发展而来的. 2.vim的三种模式: 1>.命令模式 -- 打开文件后,默认进入命令模式. 2>.编辑模式 -- 需要输入一些命令,切换到编辑模式. 3& ...
- django登录逻辑
django-restframework中已经实现了登录逻辑,只需要安装配置就可以使用 pip install djangorestframework-jwt REST_FRAMEWORK = { ' ...
- Visual Studio Code create the aps.net core project(Visual Studio Code 创建asp.net core项目)
Install the C# plug-in as shown below: Perfom the dotnet new --help command as shown below: Enter a ...
- mysql error 1067 invalid default timestamp
问题 MySQL 5.7版本,在创建数据表时,使用以下语句定义一个字段: `update_time` timestamp DEFAULT '0000-00-00 00:00:00' ON UPDATE ...
- STM32 USB-三个HID-interface 复合(组合)设备的代码实现-基于固件库(原创)
一.概论: 在STM32_USB-FS-Device_Lib_V4.1.0的Custom_HID工程基础上进行修改: 开发一款设备,有三个HID接口,mouse+pen+自定义HID 其中:0_HID ...