Synchronized原理及升级

一、synchronized可以解决可见性、原子性、有序性

1.可见性:synchronized对一个类或对象加锁时必须先获得锁,而锁的状态其他线程是可见的,并且在释放锁之前会将对变量的修改刷新到内存中,保证变量是可见的。

2.原子性:因为在执行 之前,类或对象先要获取锁,直到执行完才能释放。也就是一次只有一个线程执行,所以一个线程的执行不受干扰,保证原子性。

3.有序性:java编译器和处理器会对指令进行重排,但指令重排不会影响单线程的顺序,他影响的是多线程的顺序,而synchronized保证每个时刻只有一个线程执行,所以可以保证有序性。

二、synchronized三种使用方式:

1.修饰实例方法:给当前实例对象加锁

2.修饰静态方法:给当前类对象加锁

3.修饰代码块:给指定对象或类加锁

三、synchronized实现原理:

从底层指令角度来看,synchronized是基于monitor监视器来实现的,也叫做管程。

monitor是为了解决操作系统级别线程同步原语的复杂性。

每个对象都存在与之关联的monitor,monitor一次只有一个线程能拥有,所以是线程私有的数据结构。

通过将monitorenter指令插入在编译后的同步代码块的开始位置,将monitorexit指令插入到异常和结束位置,当一个线程常识获取锁对象时,如果monitor对象为0,意味着当前monitor还未被获取,这个线程就会立刻拥有,然后将锁计算器+1。对象的锁计数器>0,则其他线程再想获取该对象锁,就需要等待EntryLIst等待,直到锁释放。如果该线程已经拿到了monitor,又重入这把锁,计数器就会累加。当该线程调用wait方法,则进入waitset队列等待唤醒,如果唤醒执行退出后就会释放monitor。

四、锁升级

JDK1.6后对synchronized进行升级,引入偏向锁和轻量级锁来提高执行效率。锁的状态有四种:无状态锁、偏向锁、轻量级锁、重量级锁。锁可以升级但不能降级。

1.偏向锁:

偏向锁的依据是对于绝大部分锁,在整个同步周期内不仅不存在竞争,而且总是由同一线程多次获得。

偏向锁获取过程:线程第一次获取锁对象的时候,JVM会将锁对象的对象头中的锁状态设置为偏向锁,同时记录线程的id,持有偏向锁的线程每次进入或退出时,只需要判断当前对象头中是否存在该线程id,如果是则直接访问。

当另一个线程也要获取锁对象时,就撤销该偏向锁,升级为轻量级锁。

2.轻量级锁:

通过CAS操作获取锁对象,如果CAS自旋次数过多,说明竞争激烈则会升级为重量级锁。

3.重量级锁:

monitor监视器本质是调用操作系统底层互斥信号量实现。操作系统需要从用户态切换到内核态,保存线程上下文信息,执行完成后再恢复上下文信息,转换成本很高,所以synchronized效率低。

-----------------------------------------------------------------------------------------------

参考原文:https://www.nowcoder.com/discuss/353148565528715264?sourceSSR=search、

https://www.bilibili.com/video/BV1mS4y1F7A4/?spm_id_from=333.337.search-card.all.click&vd_source=ca2283defbe877efb126e8770f769d10

全部评论

相关推荐

评论
2
15
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9672次浏览 89人参与
# 你的实习产出是真实的还是包装的? #
1758次浏览 40人参与
# MiniMax求职进展汇总 #
23855次浏览 308人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7464次浏览 43人参与
# 简历第一个项目做什么 #
31568次浏览 330人参与
# 重来一次,我还会选择这个专业吗 #
433365次浏览 3926人参与
# 巨人网络春招 #
11304次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186990次浏览 1122人参与
# 牛客AI文生图 #
21408次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152293次浏览 887人参与
# 研究所笔面经互助 #
118873次浏览 577人参与
# 简历中的项目经历要怎么写? #
310079次浏览 4194人参与
# AI时代,哪些岗位最容易被淘汰 #
63432次浏览 804人参与
# 面试紧张时你会有什么表现? #
30490次浏览 188人参与
# 你今年的平均薪资是多少? #
213013次浏览 1039人参与
# 你怎么看待AI面试 #
179875次浏览 1235人参与
# 高学历就一定能找到好工作吗? #
64313次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76438次浏览 374人参与
# 我的求职精神状态 #
447988次浏览 3128人参与
# 正在春招的你,也参与了去年秋招吗? #
363256次浏览 2637人参与
# 腾讯音乐求职进展汇总 #
160585次浏览 1111人参与
# 校招笔试 #
470477次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务