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

文章目录

synchronized特性

  • 互斥

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

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

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

  • 刷新内存

    synchronized的工作过程:

    1.获得互斥锁

    2.从主内存拷贝变量的最新版本到工作内存

    3.执行代码

    4.将更改后的变量值刷新到主内存

    5.释放互斥锁

  • 可重入

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

synchronized原理

锁升级/锁膨胀

解释:

synchronized更多的考虑到降低程序员的使用负担,内部就实现了"自适应"的操作。这个"自适应"的操作就是"锁升级/锁膨胀"

如果当前程序中,锁竞争不激烈,则以轻量级锁的状态来工作。可以第一时间拿到锁。

如果当前程序中,锁竞争很激烈,则以重量级锁的状态来工作。减少CPU的开销。

偏向锁是什么呢?

锁消除

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

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

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

锁粗化

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

粒度粗:包含的代码多

粒度细:包含的代码少

锁粗化,就是:把粒度细的锁合并为粒度粗的锁。这样可以减少加锁和解锁的开销。

注:

  1. 对同一个对象的加锁才能进行锁粗化
  2. 锁粗化要保证粗化前和粗化后,代码的逻辑不变
相关推荐
Edward111111112 分钟前
一AI名词
java·开发语言·数据库·学习
栈溢出了15 分钟前
Redis repl_backlog 学习笔记
java·开发语言·redis·学习
urkay-23 分钟前
Kotlin Flow分类
android·开发语言·kotlin
并不喜欢吃鱼30 分钟前
从零开始 C++----- 十五.一文吃透 C++ 异常:try-catch、栈展开、自定义异常、异常安全 noexcept 底层全剖析
java·开发语言·jvm
gr95ZS6E642 分钟前
基础入门java安全(一)--CC1基础分析
开发语言·python
智码看视界1 小时前
Day19 Spring Boot启动优化:启动时间从8秒降到2秒
java·spring boot·后端·启动优化
北京阿法龙科技有限公司1 小时前
AR智能眼镜安防应用核心指标:识别距离筑牢防线
java·开发语言·ar
杜子不疼.1 小时前
【C++】继承—C++的秘密武器,get父类的智慧
开发语言·c++
殘殤血1 小时前
Tomcat的事件监听机制:观察者模式 _
java·观察者模式·tomcat
汤姆yu1 小时前
面向具身智能的物理视频模拟器:蚂蚁灵波LingBot-Video开源模型全解析
java·大数据·人工智能·gpt·开源·大模型·音视频