jvm-高效并发

本文介绍了Java内存模型,包括主内存与工作内存的区别,volatile关键字的可见性和有序性,以及先行发生原则的作用。同时讨论了Hotspot虚拟机的线程模型,线程调度方式(抢占式和协同式)以及线程优先级的实现特点。

1. java内存模型

1.1.主内存和工作内存

  1. 工作内存保存了主内存的副本
  2. 线程对变量的所有操作都是基于工作内存进行的,线程执行完成后会将工作内存同步到主内存中

1.2 volatile

可见性:
1.修改变量后会立即同步到主内存中去。
2.使用此变量之前需要同步最新的数据到工作内存
有序性:
内存屏障,禁止指令重排序
原子性:
不具备原子性

1.3 先行发生原则-happens-before

happens-before 是解决内存有序性和可见性的问题。

java代码编译成计算机指令后,计算机在执行指令时会进行一定程度的重排序。happens-before规则相当于java设计者java开发者之间的约定。即开发者不需要关心计算机底层的细节,只要开发者遵循设计者设定的happens-before原则,可以保证共享变量的可见性。

这些规则分为两类:
1 已经存在的

  • 单一线程原则
  • 等等

2 开发者自行保证

  • volatile可见性:虽然说volatile变量对其他线程是可见的,但也要在遵循happens-before原则的前提下,如果开发者没有遵循happens-before原则,那结果是无法保证的

java线程

线程模型
Hotspot 虚拟机的线程模型是基于1:1模型实现的,即一个java线程都映射一个操作原生系统的线程
线程调度:
1 抢占式:由操作系统分配时间片。线程无法决定执行的时间,完全取决于操作系统的调度,但是可以主动让出执行时间。
2 协同式:线程执行完成后通知操作系统切换线程,所以也不会出现线程安全的问题

线程优先级:
由于java线程和操作系统的原生线程是存在一一映射的,所以尽管可以在程序中设置线程的优先级,但是最终的解释权仍在操作系统中。例如:window 中只有7中优先级,java却提供的10种优先级。这种就导致java中的1和2 对应操作系统的1,3和4 对应操作系统的2…。所以线程的优先级并不是稳定的。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值