多线程---synchronized特性+原理

synchronized特性

  • 互斥

    当某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象的synchronized就会阻塞等待。

    进入synchronized修饰的代码块相当于加锁
    退出synchronized修饰的代码块相当于解锁

  • 刷新内存

    synchronized的工作过程:
    1.获得互斥锁
    2.从主内存拷贝变量的最新版本到工作内存
    3.执行代码
    4.将更改后的变量值刷新到主内存
    5.释放互斥锁

  • 可重入

    同一把锁,连续加锁两次,不会导致死锁,那么它就是可重入的。

synchronized原理

锁升级/锁膨胀

在这里插入图片描述

解释:
synchronized更多的考虑到降低程序员的使用负担,内部就实现了“自适应”的操作。这个“自适应”的操作就是“锁升级/锁膨胀”
如果当前程序中,锁竞争不激烈,则以轻量级锁的状态来工作。可以第一时间拿到锁。
如果当前程序中,锁竞争很激烈,则以重量级锁的状态来工作。减少CPU的开销。

偏向锁是什么呢?
在这里插入图片描述

锁消除

由JVM自动判断,如果它发现某个地方的代码不需要加锁,但是你写了synchronized,它就会自动把锁给去掉。

比如:多个线程修改多个不同的变量时,你对它们分别加锁

注: JVM只有在100%确定这处代码的加锁可以去掉时才会执行锁消除操作,就算有1%的可能这儿不能去掉也不会锁消除。

锁粗化

锁的粒度,就是指:synchronized包含的代码块里代码的多少
粒度粗:包含的代码多
粒度细:包含的代码少

锁粗化,就是:把粒度细的锁合并为粒度粗的锁。这样可以减少加锁和解锁的开销。
在这里插入图片描述

注:

  1. 对同一个对象的加锁才能进行锁粗化
  2. 锁粗化要保证粗化前和粗化后,代码的逻辑不变

synchronized使用

synchronized的使用是为了加锁保证线程安全,在前面的篇章中已经详细介绍过使用的方法以及注意事项了。点击此处浏览

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值