synchronized底层原理分析

synchronized底层原理

并发叫号

static : 并发量大的时候会出现 : 跳号.重号.超过最大值

概念

互斥性 :即同一时间只允许一个线程持有某个对象锁

可见性 : 必须保证锁被释放之前,对共享变量所做的修改,对之后获得锁的对象是课件的

用法

修饰 : 静态方法 普通方法

修饰 : 代码块

monitor[监视器] : 每个对象都有一个monitor对象
在这里插入图片描述

  1. 某一线程占有这个对象的时候, 先看monitor的计数器是不是0 ,如果 是0则还没被进程占有,这个时候线程占有这个对象,并且对这对象的monitor +1 ,如果不为0 ,则表示被其他线程占有, 这个线程等待 . 当线程释放占有权的时候 monitor-1 .
  2. 同一线程可以对同一对象进行多次加锁 +1 [可重入锁]

原理分析

javap 反编译的命令

​ 对代码块加synchronized 锁: monitorenter 和 monitorExit 配合使用 [外链图片转存失败(img-bFSUyPOq-1564806854700)(C:\Users\MIMO\AppData\Roaming\Typora\typora-user-images\1564760009254.png)]

[外链图片转存失败(img-75VGIVnM-1564806854703)(C:\Users\MIMO\AppData\Roaming\Typora\typora-user-images\1564760233592.png)]

对方法进行加锁 [加标记]

[外链图片转存失败(img-J9xUXI5V-1564806854705)(C:\Users\MIMO\AppData\Roaming\Typora\typora-user-images\1564760592326.png)]

1.6JDK 之前 重量锁

Java虚拟机对synchronized 进行了优化

对象头与monitor

一个对象实例包含 : 对象头.实例变量.填充数据

[外链图片转存失败(img-wlY8tEXG-1564806854712)(../../AppData/Roaming/Typora/typora-user-images/1564761052243.png)]

对象头 : 加锁的基础 (32bit )

实例变量 :

填充数据 :

无锁状态: 没有加锁

偏向锁 : 在对象第一次被某一线程占有的时候,将是否偏向锁置1 ,锁标记置 01 ,写入线程号,当其他线程访问的时候,竞争,失败 >>> 轻量级锁

很多次被第一次占有它的线程获取次数多 成功

CAS算法 : compare and swap

竞争不激烈的时候适用,

轻量级锁 : 线程有交替适用,互斥性不是很强,CAS失败,00

重量级锁 (等待时间长) : 强互斥,10 等待时间长

因为用户线程和核心线程(非常耗时)

自旋锁 : 竞争失败的时候,不是马上转换级别,而是执行几次空循环,有可能锁被释放

锁消除 : JIT编译的时候把不必要的锁去掉

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值