java内存模型与线程
1.衡量一个服务性能好坏,没秒事务处理数(TPS)是最重要的指标之一
2.由于计算机的存储设备与处理器的运算速度之间有几个数量级差距,所以加入高速缓存 来作为内存与处理器之间的缓冲
高速缓存解决了处理器与内存的速度矛盾,也带来了 缓存一致性的问题
多个处理器都有自己的高速缓存,却共享一个主内存
3.java内存模型:
1.主内存,工作内存:主内存主要对应java堆中对象的示例数据,工作内存对应于虚拟机栈中的部分区域
定义变量访问规则,不包括局部变量与方法参数(线程私有的)
所有变量都存储在主内存(虚拟机内存的一部分),每条线程有自己的工作内存,保存了被该线程使用到的变量的主内存副本拷贝
2.内存间交互:8个操作
lock:作用于主内存,把一个变量标志位一条线程独占
unlock:
read:把变量值从主内存传输到工作内存
load:作用于工作内存,把变量放入工作内存的变量副本
use:把变量值传递给执行引擎
assign:遇到赋值的字节码时
store:工作内存变量值传递到主内存
write:把工作内存传递过来的值放入主内存变量中
read load 和 store write 必须按顺序执行
不逊于一个县城丢弃assign赋值操作:变量在工作内存中改变了必须同步回主内存
一个变量同一时刻只允许一条线程lock,可以多次 lock
3.volatile:最轻量级的同步机制
1.保证此变量对所有线程可见性:一条线程修改,其他线程立即得知
java运算不是原子性的,volatile变量运算在并发下 不安全
所以在不符合一下场景,任需要加锁(synchronized,concurrent中原子类)
运算结果不依赖变量当前值
变量不需要其他状态变量共同参与不变约束
2.禁止指令重排序优化:保证代码执行顺序与程序顺序相同
在本地代码中插入内存屏障
java内存模型对volatile变量定义的规则:
每次使用都从主内存刷新最新值
每次修改都立刻同步回主内存
4.原子性,可见性,有序性
基本数据类型的访问读写具有原子性 synchronized 对应字节码指令:monitorenter minitorexit
依赖主内存作为传递媒介实现可见性
volatile synchronized 实现有序性
5.先行发生原则:
程序次序规则
管程锁定规则
volatile变量规则
线程启动规则
线程终止规则
线程中断规则
对象终结规则
传递性
4.线程 :
实现:
使用内核线程实现:内核通过操纵调度器对线程进行调度:系统调用代价高,消耗一定内核资源
使用用户线程实现:线程建立,同步,销毁,调度完成在用户态中完成,不要内核帮助
自己解决阻塞处理,等问题 较为复杂
混合实现:操作系统提供支持的轻量级进程作为用户线程和内核线程之间的桥梁
java线程的实现:一条java线程映射到一条轻量级进程
java线程调度:分配处理器使用权限的过程
协同式:实现简单,但线程执行时间不可控
抢占式:线程切换不有线程本身决定
县城优先级不靠谱:系统优先级比java优先级少
优先级可能被系统自行改变:系统发现一个线程执行的特别多次,就会优先分配时间
状态转换:
新建
运行:可能正在执行,也可能等待cpu
无限期等待:等待被其他线程显示唤醒
没有设置Timeout参数的Object.wait()
没有设置Timeout参数的Thread.join()
LockSupport.park()
限期等待:一定时间后自动唤醒
Thread.sleep()
设置Timeout参数的Object.wait()
设置Timeout参数的Thread.join()
LockSupport.parkNanos()
LockSupport.parkUntil()
阻塞:等待获得一个排它锁