Java并发机制的底层实现原理
volatile
相比syn锁不会引起线程上下文切换和调度
lock和add前缀指令作用
将当前处理器缓存行的数据写回到系统内存
这个写会内存的操作会使在其他CPU里缓存里该
内存地址的数据无效
原因:再多处理器下,为了保证多个处理器缓存
是一致的,就会实现缓存一致性协议。每个处理
器通过嗅探在总线上传播的数据来检查自己缓存
的数据是不是过期了,当处理器发现自己缓存行
对应的内存地址被修改,就会将当前处理器的缓
存行设置为无效状态。当处理器对数据进行修
改,会重新从系统内存中把数据读到处理器缓存
行里。
禁止指令重排序
Synchronized的实现原理
实现同步的基础,Java中的每个对象都可以作为锁
对于普通同步方法,锁是当前实例对象
对于静态同步方法,锁是当前类的Class对象
对于同步方法块,锁是Synchronized括号里配置
的对象
Java对象头
三个字宽存储数组,两个字宽存储非数组,一个
字宽四字节。其中Mark Word随着锁的标识位变
化。
锁的升级和对比
偏向锁
存在竞争时才会撤销偏向锁(全局安全点)
关闭偏向锁,默认进入轻量级锁状态 -XX:-UseBiasedLocking=false
轻量级锁
如果遇到线程竞争锁,涉及到自旋操作,偏向锁
中不涉及
重量级锁 ;指令级别的的锁
锁可以升级但是不能降级,目的是为了提高获得
锁和释放锁的效率
原子操作的实现原理
1、处理器CPU如何实现原子操作
(1)使用总线锁保证原子性
总线锁就是使用处理器提供的一个LOCK#信号,
当一个处理器在总线上输出此信号时,其他处理
器的请求将被阻塞住,那么该处理器可以独占共
享内容
(2)使用缓存锁保证原子性
在同一时刻,我们只需保证对某个内存地址的操
作是原子性即可,但是总线锁定把CPU和内存之
间的通信锁住了,其他处理器不能操作其他内存
地址数据,总线开销比较大
缓存锁定是指内存区域如果被缓存在处理器的缓
存行中,并且在Lock操作期间被锁定,那么当他
执行锁操作写回到内存时,处理器不再总线上声
言Lock#信号,而是修改内部的内存地址,并允
许它的缓存一致性保证操作的原子性,因为缓存
一致性会阻止同时修改由两个以上处理器缓存的
内存区域数据,当其他处理器回写已被锁定的缓
存行的数据时,会使缓存行无效。
2、Java如何实现原子操作
使用CAS方式
利用了处理器提供的指令实现
问题
ABA问题
循环时间长开销大
只能保证一个共享变量的原子操作 可以将多个变量合成一个变量
使用锁
https://blog.csdn.net/lxiansheng001
评论0