锁的原理一首先我要去研究java对象头呢_第1页
锁的原理一首先我要去研究java对象头呢_第2页
锁的原理一首先我要去研究java对象头呢_第3页
锁的原理一首先我要去研究java对象头呢_第4页
锁的原理一首先我要去研究java对象头呢_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这这jv的对象头在对象的不同状态下会有不同的表现形式,主要有三种状态,无锁状态、加锁状态、gc标记状态。那么我可以理解jva码块。但是v当中的锁有分为很多种,从上图可以看出大体分为偏向锁、轻量析,我们只有合理的设计代码,才能合理的利用锁、那么这三种锁的原理是什publicpublicclassA3packagepackageimportimportimportstatic5publicclassJOLExample1publicstaticvoidmain(String[]args)throwsException}11))))#Running64‐bitHotSpot#Usingcompressedoopwith0‐bit#Usingcompressedklasswith3‐bit#Objectsare8bytes#Fieldsizesbytype:4,1,1,2,2,4,4,8,8#Arrayelementsizes:4,1,1,2,2,4,4,8,87com.luban.layout.AobjectOFFSETSIZETYPEDESCRIPTION04(objectheader)0100000044(objectheader)00000000(84(objectheader)82220120)124(lossduetothenextobjectInstancesize:16Spacelosses:0bytesinternal+4bytesexternal=4bytes)1Field1Fieldsizesbytype411224488[bytes]对应:[Oop(OrdinaryObjectPointer),boolean,byte,char,short,int,float,long,double]大小整个对象一共B,其中对象头(bjecthrBB字节(因为在4位虚拟机上对象的大小必须是的倍数)B?两个问题publicpublicclassAbooleanflag4#Running#Running64‐bitHotSpot#Usingcompressedoopwith0‐bit#Usingcompressedklasswith3‐bit#Objectsare8bytes#Fieldsizesbytype:4,1,1,2,2,4,4,8,8#Arrayelementsizes:4,1,1,2,2,4,4,8,878com.luban.layout.Aobject9OFFSETSIZETYPEDESCRIPTION04(objectheader)01000000))44(object00000000)84(object82220120)()121boolean133133(lossduetothenextobjectInstancesize:16Spacelosses:0bytesinternal+3bytesexternal=3bytes整个对象的大小还是没有改变一共16B,其中对象头(Object关于java首先openjdk文档当中对对象头的解objectCommonstructureatthebeginningofeveryGC-managedheapobject.(Everyooppointstoanobjectheader.)Includesfundamentalinformationabouttheheapobject'slayout,type,GCstate,synchronizationstate,andidentityhashcode.Consistsoftwowords.Inarraysitisimmediayfollowedbyalengthfield.NotethatbothJavaobjectsandVM-internalobjectshaveacommonobjectheaderformat上述中提到一个java对象头包含了2个word,并且好包含了堆对象的布markThefirstwordofeveryobjectheader.Usuallyasetofbitfieldsincludingsynchronizationstateandidentityhashcode.Mayalsobeapointer(withcharacteristiclowbitencoding)tosynchronizationrelatedinformation.DuringGC,maycontainGCstatebits. klassThesecondwordofeveryobjectheader.Pointstoanotherobject(ametaobject)whichdescribesthelayoutandbehavioroftheoriginalobject.ForJavaobjects,the"klass"containsaC++style"vtable". 的源码注释中得知到一个markword一个是64bit,那么klass的长度是多少呢?根据上述利用JOL打印的对象头信息可以知道一个对象头是12B,其中8B是markword4B就是klassword了,和锁相关的就是markword了,那么接下来重点分析markword里面信息publicstaticvoidmain(String[]args)throwsExceptionAa=newout.println("befor//JVM计算的out.println("after13beforcom.luban.layout.AobjectOFFSETSIZETYPEDESCRIPTION04(objectheader)01000000 44(objectheader)00000000 6678984(objectheader)43c10020)121booleanA.flag133(lossduetothenextobjectInstancesize:16Spacelosses:0bytesinternal+3bytesexternal=3bytes)afterhashcom.luban.layout.Aobjectinternals:OFFSETSIZETYPEDESCRIPTIONVALUE04(objectheader)019409e4)44(objectheader)6a000000))(84(objectheader)43c10020)121booleanA.flag133(lossduetothenextobjectalignment)Instancesize:16bytesSpacelosses:0bytesinternal+3bytesexternal=3bytes)26Processfinishedwithexitcode Stringcode= 20分析结果 印完hashcode之后 储。其中2行是我们通过hashcde方法打印的结果,行是我根据-B的信息计算出来的hashcde,所以以确定对象头当中的markwok里面的后七个字节的是hashcd信息,那么第一个字节当中的八位分别存的就是分带、偏向锁信息,和对象状态,这个t分别表示的信息如下图(其实上图也有信息),关于对象状态一共分为五种状态,分别是无锁、偏向锁、轻量锁、重量锁、C标记,那么t,如何能表示五种状态(bt4中状态分别是:1,m做的比较好的是把偏向锁和无锁状态表示为同一个状态,根据偏向标识标识锁还向锁。什思呢个代码分析一下,在写代码之前我们先记得无锁状态下的信息 ,然写一个偏向锁的例子看看结果packagepackageimportimportstatic45publicclassJOLExample2staticstaticApublicstaticvoidmain(String[]args)throwsExceptiona=newout.println("befreout.println("after}publicstaticvoidsync()throwsInterruptedExceptionsynchronized} 23404 544 684 ))7121boolean133(lossduetothenextobjectInstancesize:16Spacelosses:0bytesinternal+3bytesexternal=3bytesaftercom.luban.layout.AobjectOFFSETSIZETYPEDESCRIPTION04(objectheader)01000000)44(objectheader)00000000)(84(objectheader)43c10020)121booleanA.flag133(lossduetothenextobject)分析结果上面这个程序只有一个线程去调用sync 和无锁的时候一模一 们可以直接通过JVM的参数来禁用延迟-XX:+UseBiasedLocking-packagepackageimportpackagepublicclassAintpublicsynchronizedvoid}7importimportstatic//‐XX:BiasedLockingStartupDelay=20000publicclassJOLExample3publicstaticvoidmain(String[]args)throwsExceptionAa=newlongstart=9for(inti=0;i<}Llongend=System.out.println(String.format("%sms",end‐ 19那么问题来了,什么是轻量级锁呢?工作原理是什么呢?为什么比偏向锁慢?轻量级锁尝试在应用层面解决线程同步问题,而不触发操作系统的互斥操作,轻量级锁减少多线程进入互斥的几率,不能代替互斥packagepackageimportimportstatic4publicclassJOLExample5staticApublicstaticvoidmain(String[]args)throwsExceptiona=newout.println("befreout.println("after} publicstaticvoidsync()throwsInterruptedExceptionsynchronizedsynchronizedout.println("lock}}221package1package23import4568publicclassJOLExample4staticCountDownLatchcountDownLatch=newpublicstaticvoidmain(String[]args)throwsException{finalAa=newA();79 longstart= L来计 for(intnewpublicvoidrun()while(countDownLatch.getCount()>0)}}}longend=System.out.println(String.format("%sms",end‐ 30packageimportimportstatic4publicclassJOLExample6staticApublicstaticvoidmain(String[]args)throwsExceptiona=newout.println("befreThreadt1=newpublicvoidrun()synchronizedtrySystem.out.println("t1}catch(InterruptedExceptione)}}}out.println("t1lockout.println("afterout.println("after}publicstaticvoidsync()throwsInterruptedExceptionsynchronizedSystem.out.println("t1main}}441package1package23import45importstatic6publicclassJOLExample7staticApublicstaticvoidmain(String[]args)throwsExceptiona=newout.println("befreThreadt1=newpublicvoidrun()synchronizedtrysynchronized(a)System.out.println("beforeSystem.out.println("after}}catch(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论