java:对象和锁

java是面向对象的编程语言,主要针对的就是对象。

近期深入学习了一下相关知识,作为知识的搬运工,把总结的一些知识记录如下。

在java中,对象的结构宏观上可以看作为以下结构:


对象头(Header)主要分为两部分构成:

1、Mark World:主要存储哈希码、GC分代年龄、锁的标志位等信息。以32bit为例,其中4bit用于存储GC分代,1bit用于表示是否偏向(0未偏向 1偏向),2bit用于锁的标志位,剩余25bit 主要 用于存储哈希码和持有线程等。

2、类型指针:主要用于表示对象实例属于哪个类。

实例数据:

主要用于存储对象的实际数据。

对其填充:

本质上,主要起占位符的作用。因为根据JVM的要求,对象分配的空间大小必须是8的整数倍。

后两部分还是比较好理解的,现在主要说说有关对象头的一些使用场景,这就结合了后面我们说的锁。

JDK在1.6的版本以后,synchorized关键字的具体细节大概有偏向锁,轻量级锁以及重量锁等。这里主要说下偏向锁和轻量级锁。

偏向锁

        本质上是在对象头的Mark World区域设置一个ThreadId,用来表明使用线程,主要是为了减少加锁解锁以及过多的CAS操作。(因为很多时候,并不存在多线程的竞争)

        大概的流程如下:首先对象Mark World内有一个ThreadId,初始的时候为0,偏向标志位也为0,对象处于biasable状态,锁的标志位为01,表明锁可获得。当有一个线程尝试去操作这个对象,首先使用CAS去尝试将ThreadId改变。如果失败,说明此时存在竞争,那么会在一个相对安全的点将获得锁的线程挂起,将锁升级为轻量级锁。如果成功的话,偏向标志位也为1,对象处于biased状态,进而执行同步代码块,然后释放锁。

轻量级锁

        在进入代码块时,如果对象未锁定(锁标志位为01状态),那么将在虚拟机线程的栈帧中创建一个名为Lock Record的空间(好像也有叫Displaced Mark Word),用于存储当前对象Mark Word的拷贝。然后虚拟机尝试使用CAS将对象的Mark Word替换为Lock Record的引用,如果该操作成功了,标志位变为00,即此时对象获得了轻量级锁。如果失败,则会自旋,进而变为重量级锁,标志位为10。随后进行解锁,如果对象的Mark Word仍然指向线程的Lock Record,那么用 CAS 操作把对象当前的 Mark Word 和线程中复制的 Displaced Mark Word 替换回来。

        轻量级锁能提升程序同步性能的依据是 “对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。如果没有竞争,轻量级锁使用 CAS 操作避免了使用互斥量的开销,但如果存在锁竞争,除了互斥量的开销外,还额外发生了 CAS 操作,因此在有竞争的情况下,轻量级锁会比传统的重量级锁更慢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容