【你问我答】synchronized在jvm里是怎么实现的?

问题描述:

synchronized在jvm里面是怎么实现的?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##Java工程师##面试题目#
全部评论
1、synchronized简介:       synchronized 关键字解决的是多个线程之间访问资源的同步性,保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 2、三种使用方式:       修饰实例方法: 作用于当前对象实例加锁       修饰静态方法: 也就是给当前类加锁       修饰代码块 :指定加锁对象 3、synchronize的底层:      A、synchronized 同步语句块的情况:            通过 JDK 自带的 javap 命令查看,synchronized 同步语句块的实现使用的是 一个monitorenter 和 两个monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。(通俗理解就是获取 对象监视器 monitor 的持有权)      B、synchronized 修饰方法的的情况:            synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法  4、总结:两者的本质都是对对象监视器 monitor 的获取。
3 回复 分享
发布于 2021-02-24 22:11
对象的结构 1. 对象结构:对象头、实例数据、对齐填充字节 2. 对象头:Mark World、指向类的指针、数组的长度 3. 根据Mark World中锁标志位的不同,可以分为:无锁、偏向锁、轻量级锁、重量级锁 流程 1. JDK 前期的时候,直接使用的是重量锁,后来进行的锁的升级 2. synchronized(Object)   2.1 当第一个线程进来时,会拿到该锁,这时候从无锁状态变成偏向锁状态,在对象头记录该线程的ID   2.2 如果第二次进来时,发现还是该线程,则直接进入即可,反之,则锁升级为轻量锁,并进行自旋操作(CAS),等待着锁的释放   2.3.如果自旋了超过了10次,则会变成重量锁,利用 OS 的 lock 指令实现
1 回复 分享
发布于 2020-12-15 17:46
给你来一个真大佬讲synchronized的帖子,牛客网上的,感谢那个大佬吧。 https://www.nowcoder.com/discuss/604631?channel=-1&source_id=profile_follow_post_nctrack
点赞 回复 分享
发布于 2021-03-05 13:30

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务