第十二章 java内存模型与线程
1 TPS: Transactions Per Second 每秒事务处理数,它代表着一秒内服务端平均能响应的请求总数
缓存 作为内存与处理器之间的缓存
缓存一致性问题
处理器<--> 高速缓存<--->缓<--->主
存
处理器<--> 高速缓存<--->一<--->内
致
性
处理器<--> 高速缓存<--->协<--->存
议
2 java内存模型
内存模型的目标:定义程序中的各个变量的访问规则,即在虚拟机中将变量存储到内存中和从内存中取出变量这样的底层细节
变量:实例字段,静态字段和构成数组对象的元素,单不包含局部变量与方法参数,因为后者是线程私有的
规定所有的变量都存储在主内存中
每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝
线程对变量的所有操作都必须在工作内存中完成,而不是直接读写主内存中的变量。
不同线程之间也无法直接访问对方工作内存中的变量
线程间变量值的传递均需要通过主内存来完成
java线程<-->工作内存<--->SAVE<--->主
和
java线程<-->工作内存<--->LOAD<--->内
操
java线程<-->工作内存<--->作 <--->存
主内存,工作内存,与java内存区域中的堆,栈,方法区域等并不是同一层次的内存划分
3 内存间交互操作
主内存
lock 锁定
unlock 解锁
read 读取
load 载入
工作内存
use 使用
assign 赋值
store 存储
write 写入
4 对于volatitle 型变量的特殊规则
两个特性:1,保证此变量对所有线程的可见性
2,禁止指令重排序优化
由于volatile只能保证可见性,在不符合以下两个原则的运行场景中,仍然通过加锁(synchronized或者java.util.concurrent中的原子类)来保证原子性
1,运算结果并不依赖变量的当前值,或者能够确保只要单一线程的线程修改变量的值
2,变量不需要与其他的状态变量共同参与不变约束
内存屏障:指重排时不能把后面的指令重排序到内存屏障之间的位置
对于long和double型变量的特殊规则
允许虚拟机实现选择可以不保证64位数据类型的load,store,read和write这4个操作的原子性
这就是long和double的非原子性协定
java内存模型主要是围绕在并发过程中如何处理原子性,可见性,有序性这三个特征来建立的
原子性:常见操作,read,load,assign,use,store,write (long,double的非原子协定除外),lock,unlock
可见性:java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性
volatile 保证了多线程操作时变量的可见性
synchronized final 也可以实现可见性
同步快的可见性:对一个变量执行unlock之前,必须先把此变量同步回主内存中(执行store,wrie操作)这条规则获得的
被final修饰的字段在构造器一旦初始化完成,并且构造器没有把'this'引用传递出去,那么其他线程就能看见final字段的值
有序性:volatile和synchonized
先行发生原则 happens-before
程序次序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。准确的说,应该是控制流顺序而不是程序代码顺序,因为要考虑
到分支,循环等结构
管程锁定规则:一个unlock操作先行发生于后面对于同一个锁的lock操作,强调同一个锁,而‘后面’是指时间上的先后顺序
volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,而‘后面’是指时间上的先后顺序
线程启动规则:Thread对象的start()方法先行发生于此线程的每一个动作
线程终止规则:线程的所有操作都先行发生于对此线程的终止操作,可以通过Thread.join(),Thread.isAlive()等手段来检测线程已经终止执行
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
对象终结规则:一个对象的初始化完成(构造函数执行结束) 先行发生于它的finalize()方法的开始
传递性:如果操作A先行发生于B,而操作B先行发生于操作C,那么可以得出结论操作A先行发生于操作C
线程的实现方式
1,使用内核线程实现
2,使用用户线程实现
3,使用用户线程加轻量级进程混合实现
线程调度方式:
协同式线程调度和抢占式线程调度
状态转换
java线程五种状态
新建new,运行Runable,无限期等待Waiting,限期等待TimedWaiting,阻塞Blocked,结束Terminated
相关推荐
作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益! 本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...
《深入JAVA虚拟机第二版》是一本专注于Java虚拟机(JVM)的权威指南,针对JVM的深入了解和优化提供了详尽的解析。这本书对于Java开发者、系统管理员以及对Java性能调优感兴趣的读者来说,是不可或缺的参考资料。下面...
第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列...
第12节Java虚拟机-classic vm00:06:06分钟 | 第13节Java虚拟机-ExactVM00:03:35分钟 | 第14节Java虚拟机-HotSpotVM00:04:23分钟 | 第15节Java虚拟机-kvm00:03:04分钟 | 第16节Java虚拟机-JRockit00:04:12分钟 | ...
《深入Java虚拟机源码》一书主要涵盖了Java虚拟机(JVM)的内部工作原理,...通过对这些章节的学习,读者将能够深入理解Java虚拟机的工作原理,更好地进行性能优化和问题定位,从而提升Java应用程序的稳定性和效率。
本书共分20章,第1-4章解释了Java虚拟机的体系结构,包括Java栈、堆、方法区、执行引擎等;第5-20章深入描述了Java技术的内部细节,包括垃圾收集、Java安全模型、Java的连接模型和动态扩展机制、class文件、运算及...
第二部分则深入探讨了Java虚拟机的内部机制,涵盖了类的生命周期、链接模型、垃圾回收、栈和局部变量操作、类型转换等内容。 ### 第一部分:Java的架构 - **第1章:Java体系结构简介** - 提供了一个概览,介绍Java...
第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...
《深入JAVA虚拟机第二版》是一部深度探讨Java虚拟机(JVM)的权威著作,它为开发者揭示了Java程序运行的底层机制,帮助读者理解并优化Java应用性能。本资源包含该书的第二版部分内容,分为了六个部分,分别是:part...
深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...
《深入Java虚拟机(第二版)》是一本深入解析Java平台核心技术的重要著作,它详细阐述了Java虚拟机(JVM)的工作原理和技术细节。这本书旨在帮助开发者更好地理解Java程序的运行机制,提升性能优化和故障排查的能力...
- **第四章**:解释Java虚拟机的内存模型及其管理机制。 - **第五章**:讨论Java虚拟机的异常处理机制。 - **第六章**:介绍线程管理和同步机制。 - **第七章**:涉及类文件结构和加载机制。 #### 三、Java...
第12章 整数运算 12.1 二进制补码运算 12.2 Inner Int:揭示Java int类型内部性质 的applet 12.3 运算操作码 12.4 一个模拟:“Prime Time” 12.5 随书光盘 12.6 资源页 第13章 逻辑运算 13.1 逻辑...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。Java虚拟机规范SE8,即...阅读《Java虚拟机规范SE8》可以帮助开发者深入理解Java平台的内部工作原理,从而编写出更加高效、稳定的代码。
《Java虚拟机高级特性与最佳实践》是一本深入解析Java虚拟机(JVM)的权威著作,尤其在第二版中,作者对JVM的高级特性进行了详尽的阐述,并提供了丰富的最佳实践指导。这本书对于想要深入理解Java平台的开发者来说,...
第12章 整数运算 12.1 二进制补码运算 12.2 Inner Int:揭示Java int类型内部性质的applet 12.3 运算操作码 12.4 一个模拟:“Prime Time” 12.5 随书光盘 12.6 资源页 第13章 逻辑运算 13.1 逻辑...