专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Java中synchronized的底层实现原理

  一、对象头、MarkWord、monitor、synchronized怎么关联起来
  (1)首先java里面每个对象JVM底层都会为它创建一个监视器monitor,这个是JVM层次为我们保证的。这个监视器就类似一个锁,哪个线程持有这个monitor的操作权,就相当于获取到了锁
  (2)其次synchronized修饰的代码或者方法,底层会生成两条指令分别为monitorenter、monitorexit。
  (3)进入synchronized的代码块之前会执行monitorenter指令,去申请monitor监视器的操作权,如果申请成功了,就相当于获取到了锁。如果已经有别的线程申请成功monitor了,这个时候它就得等着,等别的线程执行完synchronized里面的代码之后就会执行monitorexit指令释放monitor监视器,这样其它在等待的线程就可以再次申请获取monitor监视器了。
  monitor又是个啥东西?为什么monitor能当做锁?首先既然你知道每个对象都有一个monitor监视器,那你知道每个对象是怎么和它的monitor监视器关联起来的不?
  通过synchronized进行加锁,就是通过对象头的MarkWord关联起来的,里面记录着锁状态和占有锁的线程地址指针。
  当MarkWord中最后两位的锁标志位是10的时候,MarkWord的前面是monitor监视器的地址,我现在就给你画出来对象头、MarkWord和monitor之间的关系图(32位):
  二、monitor内部结构
  monitor叫做对象监视器、也叫作监视器锁,JVM规定了每一个java对象都有一个monitor对象与之对应,这monitor是JVM帮我们创建的,在底层使用C实现的。
  其实monitor在C底层也是某个类的对象,那个类就是ObjectMonitor,它拥有的属性也字段如下:结构体如下ObjectMonitor::ObjectMonitor(){header;count;非常重要,表示锁计数器,count0表示还没人加锁,count0表示加锁的次数waiters;recursions;owner;非常重要,指向加锁成功的线程,ownernull时候表示没人加锁waitset;wait线程的集合,在synchorized代码块中调用wait()方法的线程会被加入到此集合中沉睡,等待别人叫醒它waitsetLock;responsiable;succ;cxq;freenext;entrylist;非常重要,等待队列,加锁失败的线程会被加入到这个等待队列中,等待再次争抢锁spinFreq;获取锁之前的自旋的次数spinclock;获取之前每次锁自旋的时间ownerIsThread;}3。1、monitor加锁原理
  count:这个属性非常重要,直接表示有没有被加锁,如果没被线程加锁则count0,如果count大于0则说明被加锁了
  owner:这个属性也非常重要,直接指向加锁的线程,比如线程A获取锁成功了,则owner线程A;当ownernull的时候表示没线程加锁
  waitset:当持有锁的线程调用wait()方法的时候,那个线程就会释放锁,然后线程被加入到monitor的waitset集合中等待,然后线程就会被挂起。只有有别的线程调用notify将它唤醒。entrylist:这个就是等待队列,当线程加锁失败的时候被block住,然后线程会被加入到这个entrylist队列中,等待获取锁。
  spinFreq:获取锁失败前自旋的次数;JDK1。6之后对synchronized进行优化;原先JDK1。6以前,只要线程获取锁失败,线程立马被挂起,线程醒来的时候再去竞争锁,这样会导致频繁的上下文切换,性能太差了。JDK1。6后优化了这个问题,就是线程获取锁失败之后,不会被立马挂起,而是每个一段时间都会重试去争抢一次,这个spinFreq就是最大的重试次数,也就是自旋的次数,如果超过了这个次数抢不到,那线程只能沉睡了。spinClock:上面说获取锁失败每隔一段时间都会重试一次,这个属性就是自旋间隔的时间周期,比如50ms,那么就是每隔50ms就尝试一次获取锁。
  下面通过图文展示加锁过程:
  (1)首先呢,没有线程对monitor进行加锁的时候是这样的:
  说明:count0表示加锁次数是0,也就是没线程加锁;owner指向null,也就是没线程加锁
  (2)然后呢,这个时候线程A、线程B来竞争加锁了,如下图所示:
  (3)线程A竞争到锁,将count修改为1,表示加锁次数为1,将owner线程A,也就是指向自己,表示线程A获取到了锁。在count0,ownernull的时候,表示monitor没人加锁,这个时候线程A和线程B同时请求加锁,也就是竞争将count改为1。由于线程A这哥们动作比较快,它将count改为1,获取锁成功了。它还嘚瑟了一下,同时将onwer线程A,表示自己获取了锁,告诉线程B,兄弟不好意思了,是我获取了锁,我先去操作了。
  既然加锁就是将count设置为1,同时将owner指向自己。那反过来推测,释放锁的时候是不是将count设置为0,将owner设置为null就OK了?是的,释放锁的过程就是这么简单:
  加锁和释放锁说完了,我们接下来将的是
  spinFreq、spinclock、entrylist
  这几个东西:
  上面解释字段属性的时候说spinFreq是等待锁期间自旋的次数、spinclock是自旋的周期也就是每次自旋多久时间、entrylist这个就是自旋次数用完了还没获取锁,只能放到entrylist等待队列挂起了。
  让我们继续接着图来讲:
  (1)首先线程B获取锁的时候发现monitor已经被线程A加锁了(2)然后monitor里面记录的spinFreq、spinclock信息告诉线程B,你可以每隔50ms来尝试加锁一次,总共可以尝试10次(3)如果线程B在10次尝试加锁期间,获取锁成功了,那线程B将count设置为1,owner指向自己表示自己获取锁成功了(4)如果10次尝试获取锁此时都用完了,那没辙了,它只能放到等待队列里面先睡觉去了,也就是线程B被挂起了spinFreq和spinclock这两个monitor的属性主要是让线程自旋的时候使用的吧。entryList作用是当线程自旋次数都用完了之后,只能进入等待队列进行休眠了。4。6、轻量级锁
  轻量级锁模式下,加锁之前会创建一个锁记录,然后将MarkWord中的数据备份到锁记录中(MarkWord存储hashcode、GC年龄等很重要数据,不能丢失了),以便后续恢复MarkWord使用。这个锁记录放在加锁线程的虚拟机栈中,加锁的过程就是将MarkWord前面的30位指向锁记录地址。所以markword的这个地址指向哪个线程的虚拟机栈中,就说明哪个线程获取了轻量级锁。就好比下面的图,线程A获取了轻量级锁,锁记录存在线程A的虚拟机栈中,然后MarkWord的前面30位存储锁记录的地址。
  了解了轻量级加锁的原理之后,我们继续,来讲讲偏向锁升级为轻量级锁的过程:
  (1)首先线程A持有偏向锁,然后正在执行synchronized块中的代码
  (2)这个时候线程B来竞争锁,发现有人加了偏向锁并且正在执行synchronized块中的代码,为了避免上述说的线程A一直持有锁不释放的情况,需要对锁进行升级,升级为轻量级锁
  (3)先将线程A暂停,为线程A创建一个锁记录LockRecord,将MarkWord的数据复制到锁记录中;然后将锁记录放入线程A的虚拟机栈中
  (4)然后将MarkWord中的前30位指向线程A中锁记录的地址,将线程A唤醒,线程A就知道自己持有了轻量级锁
  4。6。2、在轻量级锁模式下,多线程是怎么竞争锁和释放锁的?
  (1)线程A和线程B同时竞争锁,在轻量级锁模式下,都会创建LockRecord锁记录放入自己的栈帧中
  (2)同时执行CAS操作,将MarkWord前30位设置为自己锁记录的地址,谁设置成功了,锁就获取到锁
  上面讲了加锁的过程,轻量级锁的释放很简单,就将自己的LockRecord中的MarkWord备份的数据恢复回去即可,恢复的时候执行的是CAS操作将MarkWord数据恢复成加锁前的样子。Javasynchronized偏向锁后hashcode存在哪里?jdk8偏向锁是默认开启,但是是有延时的,可通过参数:XX:BiasedLockingStartupDelay0关闭延时。hashcode是懒加载,在调用hashCode方法后才会保存在对象头中。当对象头中没有hashcode时,对象头锁的状态是可偏向(biasable,101,且无线程id)。如果在同步代码块之前调用hashCode方法,则对象头中会有hashcode,且锁状态是不可偏向(001),这时候再执行同步代码块,锁直接是轻量级锁(thinlock,00)。如果是在同步代码块中执行hashcode,则锁是从偏向锁直接膨胀为重量级锁。

神农秋韵神农架国家森林公园位于湖北省西北部,由房县兴山巴东三县边缘地带组成,面积3250平方公里,建于1983年,为森林与野生动物类型国家级自然保护区。1992年,神衣架自然保护区1990奥维互动地图下载实时高清卫星地图天地图谷歌地图手册2023年奥维互动地图浏览器下载集成Google地图卫星图地形图Bing卫星图等高线地图三维地图百度地图搜狗地图全球地图离线下载全球语音导航好友位置分享记录轨迹实时路况指南针等功能与一体的奥PyQt6如何创建多窗口在之前的教程中,我们已经介绍了如何打开对话框窗口。这些特殊的窗口(默认情况下)抓住用户的焦点,并运行自己的事件循环,有效地阻止了应用程序其余部分的执行。然而,您经常希望在不中断主窗杭州楼市又出大招,行情升温,多亏了杭州二手房我是杭州房哥,资深房产投资专家。你相见恨晚的买房导师,目前已为7000人提供买房最佳解决方案。房哥不像其他自媒体,遮遮掩掩的让你摸不清头脑!房哥属于实战派只说对你最有用的操作和建议切入XR赛道,微信小程序要翻开新的篇章小程序作为微信近年来最大的创新之一,也使得其事实上成为了操作系统中的操作系统,丰富的小程序生态更是为微信创造了几乎无线的可能。日前,微信小程序再次放出大招,宣布推出ARVR3D框架大厂程序员兼职外卖小哥一晚能送十余单,还不耽误白天工作东方网记者程琦12月21日报道近日,上海市网购商会发出倡议,鼓励近期未到岗工作,或有闲暇时间的居民,在确保自身身体健康的条件下,加入到配送的行列当中。97年的小伙明泽就是积极响应号玩溜早餐荟全国首家奥特曼主题酒店将于春节期间开业洲际酒店旗下智选假日品牌升级3。0版悦榕集团旗下鸿居酒店将进驻巴厘岛等地1全国首家奥特曼主题酒店将于春节期间开业上海海昌海洋公园全国首家奥特曼主题酒店开启首日预售后三秒售罄。据悉,酒店包含6大主题全球首创105间盲盒式客房,集住宿互动娱乐餐饮于一体,并孩子居家妈妈别着急,手抓饼版的苹果甜甜圈安排上,好吃又好做北京的中小学生们,晚上估计都收到了通知,要求下周开始线上网课。作为俩娃的妈,我也挺郁闷的,不过没有办法,在家就在家吧,我只要把后勤做好就行,主要是食物供给足够就成。给孩子们做了手抓泰迪外套才是今年秋冬的黑马,洋气百搭还保暖,谁穿谁好看!女孩们的心中,除了对粉色有一种执着的偏爱,还对毛绒软乎的东西也抗拒不了,特别是冬天穿的柔软毛茸茸的外套,洋气之余还温暖人心,更加不能拒绝这样的诱惑了。所以今年外套界的黑马隆重登场,国乒12位主力调整!2人转行1人换岗,五将瞄准巴黎,3人或被弃眼下已经进入到2022年底,国乒继续在海南开始集训,期待在明年打出更好的成绩。值得一提的是,目前来看国乒新老两代的12大主力,他们最近的安排发生了各种各样的变化,对明年整体的作战计走出史上最长换机周期?智能手机市场转机就在眼前你多久没换新手机了?人们为什么不愿换手机了一度成为社会热点话题。在大众看来,两年前的旗舰机还经久耐用新机型的功能升级不够有吸引力疫情影响消费意愿等都是延迟更换新机的因素。最近多家咨
水星东大距28日上演,公众有望目睹水星靓影新华社天津8月26日电(记者周润健)8月28日,水星将迎来2022年第五次大距,也是第三次东大距。天文科普专家表示,本次大距时,水星的地平高度有些低,观测起来有一定难度。届时如果天城市化引起的反照率变化将加剧全球变暖导语最近几十年,城市化引起的土地利用变化从根本上改变了地表的物理特性地表能量平衡水文循环和生物地球化学过程,并引发了一系列环境和气候后果。最近发表在NatureCommunicatNASA发布ArtemisI任务的官方发射预告片美国宇航局(NASA)的ArtemisI任务的目标是不早于2022年8月29日发射。两个小时的发射窗口在美国东部时间8月29日(周一)上午8点33分开启。ArtemisI将是NAS令人震惊的宇宙对数视图可以追溯到时间的边缘宇宙是巨大的,而地球位于我们已知宇宙的边缘,距离很远。把这一点放到一个标尺上是很困难的,而且不能正确地展示宇宙有多大。然而,当你开始看宇宙的对数视图时,就会更容易知道我们的宇宙有多这四支小众变形宽银幕定焦镜头或许会是黑马TECHNOVISION1。5XAproXima定焦变宽镜头来自德国的PSTECHNIK,最近宣布推出TECHNOVISION1。5XAproXima定焦变形宽银幕镜头群。目前有T千块价格新方式,iQOOZ6快速充电性能指标这里都有就在不久前,iQOOZ系列终于迎来了更新,新机iQOOZ6正式发布。因为该机有骁龙778GPlus双电芯80W闪充等配置,显得其在千元价位段非常有竞争力。那样iQOOZ6的手机体验脚步声听得更清楚,EPOS音珀H6PRO耳机GSX3007。1声道声卡套装测评玩枪战类游戏,有没有发现,专业玩家从来都不会用音箱去玩,别说专业电竞选手了,就连普通游戏玩家我想也没几个用音箱的,即使你的音箱效果再好,有一说一,但凡一个稍微好点的耳机,都是绝对性罗技发布三款G502X系列有线无线RGB游戏鼠标新品深受游戏玩家喜爱的罗技G502游戏鼠标家族,刚刚迎来了G502XG502XLIGHTSPEED和G502XPLUS三维新成员。外形方面,G502X在前辈基础上加以精心修改。在延续无盘点手机鸡肋的4个功能,看似高级实际用处不大,你认同几个现在,手机厂商之间的竞争已经到了白热化的阶段。各大品牌都争奇斗艳,纷纷在手机上加入新奇的功能来吸引消费者的目光。但是,有些功能根本可有可无。今天就来盘点一下,手机的4个鸡肋功能。无iPadPro2022将带来4大改动,或是4年来提升最大的一代今年即将发布新一代iPadPro。由于有关这款平板电脑的传闻一直是市场的热点,新一代iPadPro或将提供以后几个新功能。M2芯片此前苹果iPadPro采用了M1芯片,消息来源证实惊爆降价!荣耀70Pro到手仅3539元文唐水晶责编吕东兴总编唐迪近期京东开学季,想要购买华为手机的朋友可要抓紧时机了,荣耀70Pro优惠价3899元,可12期免息,以旧换新补贴450元,最低可以做到3539元。京东秒杀
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网