JAVA内存模型与线程
概述
由于计算机的运算速度和它的存储和通讯子系统的速度差距巨大,大部分时间都花在IO,网络和数据库上。为了压榨CPU的运算能力,需要并发。另外,优秀的并发程序对于提高服务器的TPS有重要的意义。
硬件的效率和一致性

Java内存模型
主内存与工作内存

加入一个工作内存的目的很明显,就是为了加快在内存中的操作数据的速度,因为工作内存优先存储在寄存器和高速缓存中,这两个操作的速度都远远快于主内存。主内存和工作内存之间交互的主要操作为:
- Lock(锁定):作用于主内存的变量,将一个变量标示为一条线程独占的状态,其他线程不能访问。
- Unlock(解锁):作用于主内存的变量,将一个处于锁定状态的变量释放出来,释放后的变量可以被其他线程锁定。
- Read(读取):作用于主内存的变量,将一个变量的值从主内存传输到线程的工作内存,,以便进行load操作。
- Load(加载):作用于工作内存中的变量,将read获取到的变量载入工作内存的变量副本中。
- Use(使用):作用于工作内存中的变量,虚拟机执行引擎在执行字节码指令的时候,碰到了一个变量就会执行该操作,使用该变量。
- Assgin(赋值):作用于工作内存中的变量,虚拟机执行引擎在执行字节码指令的时候,碰到了变量赋值的指令就会执行该操作。
- Store(存储):作用于工作内存中的变量,将工作内存中的变量放入主内存,以便进行write操作。
- Write(写入):作用于主内存中的变量,将store得到的变量放入主内存的变量中。
JAva内存模型还规定了在执行上述8中操作时必须满足如下规则:
- read 和load ,store和write 必须一对操作
- 不允许线程丢弃assign操作,变量在工作内存中改变后必须把变化同步回主内存
- 不允许一个线程无原因地没有发生过任何(assign操作)把数据从线程的工作内存同步回主存中
- 新变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化的变量(load或assign),对一个变量实时use和store之前必须先执行过assign和load操作
- 一个变量同一时刻值允许一条线程lock操作,但lock操作可以重复多次,执行相同数量的unlock,变量才会解锁
- lock操作会清空工作内存副本,执行引擎使用前,需要执行load或者assign操作初始化变量的值
- 没有lock操作,就不允许unlock操作。不允许unlock另一个线程变量。
- unlock操作前必须先把此变量同步回主内存中(执行store,write操作)
虚拟机允许将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行。
Happens-Before原则
- 程序顺序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。
- 管理锁定规则:一个unlock操作先于后面对同一个锁的lock操作。
- Volatile变量规则:对一个volatile变量的写操作必须在对该变量的读操作之前发生。
- 线程启动规则:线程的Thread.start()方法必须在该线程所有其他操作之前发生。
- 线程终止规则:线程中所有操作都先行发生于该线程的终止检测。可以通过Thread.join()方法结束、Thread.isAlive()的返回值判断线程是否终止。
- 线程中断规则:对线程interrupt()方法的调用必须在被中断线程的代码检测到interrupt调用之前执行。
- 对象终结规则:对象的初始化(构造函数的调用)必须在该对象的finalize()方法完成。
- 传递性:如果A先行发生于B,B先行发生于C,那么A先行发生于C。
关键概念
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
并行:在操作系统中是指,一组程序按独立异步的速度执行,不等于时间上的重叠(同一个时刻发生)。
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。
同步就是协同步调,按预定的先后次序进行运行。
线程安全:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这几个类都能表现出正确的行为,那么就成这个类是线程安全的。
JAVA内存模型与线程的更多相关文章
- java内存模型与线程(转) good
java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_ ...
- Java并发程序设计(三) Java内存模型和线程安全
Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗? 二.有序性 Java代 ...
- 深入理解java虚拟机-第12章Java内存模型与线程
第12章 Java内存模型与线程 Java内存模型 主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ...
- jvm(12)-java内存模型与线程
[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计 ...
- (Java多线程系列七)Java内存模型和线程的三大特性
Java内存模型和线程的三大特性 多线程有三大特性:原子性.可见性.有序性 1.Java内存模型 Java内存模型(Java Memory Model ,JMM),决定一个线程对共享变量的写入时,能对 ...
- 深入理解Java虚拟机(第三版)-13.Java内存模型与线程
13.Java内存模型与线程 1.Java内存模型 Java 内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到主内存和从内存中取出变量值的底层细节 该变量指的是 实例字 ...
- 一夜搞懂 | Java 内存模型与线程
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习内存模型与线程? 并发处理的广泛应用是 Amdah1 定律代替摩尔定律成为计 ...
- Java内存模型与线程(一)
Java内存模型与线程 TPS:衡量一个服务性能的标准,每秒事务处理的总数,表示一秒内服务端平均能够响应的总数,TPS又和并发能力密切相关. 在聊JMM(Java内存模型)之前,先说一下Java为什么 ...
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...
- java内存模型和线程
概述 多任务的处理在现在的计算机中可以说是"标配"了,在许多的情况下,让计算机同时做几件事情,不仅是因为计算机的运算能力的强大,还有一个重要的原因是:cpu的运算速度和计算机的存储 ...
随机推荐
- MCMC(四)Gibbs采样
MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)MCMC采样和M-H采样 MCMC(四)Gibbs采样 在MCMC(三)MCMC采样和M-H采样中,我们讲到了M-H采样已经可以很好 ...
- 【C++】浅谈三大特性之一继承(一)
一,为什么要引入继承? 继承是一个非常自然的概念,现实世界中的许多事物也都是具有继承性的. 例如,爸爸继承爷爷的特性,儿子又继承爸爸的特性等都属于继承的范畴.下面是一个简单的汽车分类图: 在这个分类图 ...
- as3中强制垃圾回收
private function doClearance():void { // trace("clear"); try{ new LocalConnection().connec ...
- wampserver安装错误 应用程序无法正常启动0xc000007b解决方法
在重装系统之后发现以前安装的wampserver启动会出现错误提示"应用程序无法正常启动0xc000007b解决方法",重新安装也是一样的错误.上网找了相关信息后发现,并不是只有本 ...
- 细说OC中的load和initialize方法
OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...
- 小结:Swift、OC语言中多target在代码中如何区分
一.对swift工程 经实践,网上的方法都无法成功,后来思考DEBUG宏定义方式,经实测有效,方式如下: 注意:不能把swift flags 小三角折叠后双击设置-DTarget4AppStore, ...
- Win10隐藏硬盘分区
前几天装了Win10和OpenSUSE的双系统,结果挂载Linux的分区被Windows识别成了三个盘符,在Windows下是不能直接访问它们的,而且双击还会提示你是否格式化. 因为在windows放 ...
- 接口调用 GET方式
/** * 第一步 视图展示 . 视图页面(忽略) * @return [type] [description] */ /** * 第二步 控制器先将要运行的接口处理好(接口及参数)传到到Model层 ...
- Unity3D 协程 浅谈
协程 理解:协程不是线程,也不是异步执行(知道就行). 1.协程和MonoBehaviour的Update函数一样,也是在MainThread中执行的(一定得明白这句话意思). void Start ...
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...