导图社区 深入理解JVM:高效并发核心知识点总结
一张图带你掌握Java内存模型与线程,线程安全与锁优化。该思维导图图文结合,便于理解。关于硬件的效率与一致性、内存间的交互、先发先行原则、内线线程实现、用户线程实现、Java线程的调度等内容均有详细的讲解~赶快学习起来吧。
计算机操作系统存储器管理核心知识点总结梳理。存储器管理是计算机操作系统的职能之一,主要任务是为多道程序的运行提供良好的环境,方便用户使用存储器,提高存储器的利用率以及能从逻辑上扩充内存。
计算机操作系统—处理机调度与死锁核心知识点总结
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
高效并发
Java内存模型与线程
硬件的效率与一致性
MSI、MESI等协议规范读写操作保证一致性
乱序执行
Java内存模型
主内存与工作内存
内存模型中的变量
包括实例字段、静态字段、构成数组对象的元素等
变量都存储在主内存内,每条线程有自己的工作内存(保存其使用到的变量的主内存副本拷贝),线程对变量的所有操作在工作内存中进行;不同线程间也无法直接访问对方工作内存,线程间的变量值传递均需要通过主内存来完成
内存间的交互
lock(锁定)
作用于主内存的变量,将一个变量标识为线程独占的状态
unlock(解锁)
作用于主内存,将一个锁定的变量释放出来,才能被其他线程锁定
read(读取)
作用于主内存,将一个变量值从主内存传输到工作线程的工作内存中,一遍下一个load动作
load(加载)
作用于工作内存中,将从主内存中read得到的变量放入工作内存的变量副本中
use(使用)
作用于工作内存中,将工作内存中的一个变量传递给执行引擎
assign(赋值)
作用于工作内存中,将从执行引擎中接受到的值赋值给工作内存中的变量
store(存储)
作用于工作内存中,将工作内存的一个变量传递到主内存,以便后续write
write(写入)
作用于主内存中,将store获得的工作内存的值放入主内存中的变量
使用规则
对volatile型变量的特殊规则
(Java虚拟机提供的轻量级同步机制)
两种特性
保证变量对所有线程的可见性(一个线程改变了他的值,其他线程可立即得知)
每次运行结果不同,因某线程做add时,其他线程可能已经加大了变量,导致返回了较小的数
所以还是需要加锁
禁止指令重排序优化
使用场景
对long、double型的特殊规则
虚拟机允许对没有volatile修饰的64位变量分为两个32位处理(非原子性协定)
原子性、可见性和有序性
原子性
可见性(同上)
volatile
synchronized
final
有序性
先发先行原则
(判断数据是否存在竞争、线程是否安全的依据)
Java与线程
线程的实现
(Java.lang.thread类的实例就代表一个线程);方法为native,平台相关
内核线程实现
用户线程实现
(完全建立在用户空间,无需切换到内核态)
(实现困难)
使用用户线程+轻量级进程混合实现
轻量级进程作为用户线程与内核线程之间的桥梁,由内核线程处理用户线程处理器映射及线程调度等
Java线程的调度
(系统为线程分配处理器的过程)
协同式线程调度
线程执行时间由线程本身控制
抢占式线程调度
每个线程由系统分执行时间
状态转换
线程安全与锁优化
线程安全
Java语言中的线程安全
不可变
例如:final关键字带来的可见性
绝对线程安全
不管运行环境如何,调用者都不需要添加额外的同步措施
相对线程安全
通常意义上的线程安全,保证对这个对象单独的操作是线程安全的
线程兼容
对象本身并不安全,但可通过正确的同步手段实现安全(ArrayList、LinkList等)
线程对立
不管是否采取同步措施,都无法在多线程环境并发运行
线程安全的实现方法
互斥同步
多线程访问共享数据时,保证共享数据在同一时刻只被一条线程使用
互斥手段
临界区
互斥量
信号量
sychronized
monitorenter
获取对象锁—+1;若获取失败,线程阻塞等待
monitorexit
锁计数器-1;
重入锁ReentrantLock
(API层面的互斥锁,lock、unlock+try/catch)
非阻塞同步
(乐观并发策略:先进行操作,若没有其他线程竞争共享资源,则操作成功,若有其他争用,则进行补偿措施)
无同步方案
可重入代码
可在执行中转去执行其他代码再返回而不出错
线程本地存储
锁优化
自旋锁与自适应锁
线程执行忙循环进行等待,不放弃处理器时间
自旋次数默认为10,超过后挂起
自适应:自旋次数视情况而定
锁消除
虚拟机在即使编译器运行时,对一些代码上要求同步,但实际不发生数据竞争的锁进行消除
锁粗化
扩大锁范围
轻量级锁
偏向锁