一个Java对象的回忆录:那些被锁住的日子

简介: 一个Java对象的回忆录:那些被锁住的日子

偏向锁

“喂,别动啊,让我检查下你的lock位状态”,不知什么时候我竟然又睡着了,睁开眼睛,一位线程大哥正蹲在我的旁边,摸着我头上的MarkWord

image.png

“lock位是01,不错不错,让我再看看偏向锁标记位,哇,是1,太棒了,支持偏向锁!最后再看看thread位,是0!awesome!看来我来的比较早,还没人跟我抢”,这位线程大哥嘴里一直念叨,我也不知道他在说些什么。

image.png

“来,把你的MarkWord给我,我给你一个新的“,线程大哥手里握着一个64bit的数字,一边说,一边准备来把我头上的MarkWord换掉。

这个时候,我想起小A曾经给我说的话,一下子躲开了,“你要干嘛”,我紧张的问到。

“小朋友别紧张,我是3001号线程,执行到了synchronized代码块,需要给你这个对象加下偏向锁。来,听话,把MarkWord给我”,一边说一边带着邪魅的微笑。

“我的MarkWord不能给你随便改,改坏了怎么办”

“别怕,一会儿用完了我会给你恢复的”

我将信将疑,知道胳膊拗不过大腿,只好把头伸了过去,“你动手吧”

线程大哥执行了一个CAS操作,把我的MarkWord交换了,然后高高兴兴的离开了。

[为防抄袭,手动插入文字水印,敬请谅解。本文来自微信公众号:编程技术宇宙]

重偏向

过了一小会儿,又来了一个线程小姐姐。

“Hi,小朋友你好,我是3002号线程,现在我要来锁定你,让我检查下你的lock位状态吧”,这个线程小姐姐声音很温柔。

image.png

“lock位是01,Good!让我再看看偏向锁标记位,呀!是个1,糟糕”,小姐姐皱起了眉头。

“发生什么事了?”我开口问到。

“被3001号线程那家伙抢在前头了,把你给锁定了”

“咦,你怎么知道3001号线程来过”

“你的MarkWord里面高54位记录了他的线程指针,指向的就是3001那家伙”,小姐姐指了指我的头说到。

我看了看,果然如此,“您别着急,3001号线程大哥说了,一会儿用完会给我恢复的,要不您稍等一会,坐下休息休息?”

“不用了,我又检查了下,3001号小子已经退出同步块代码了,我可以重偏向,这下你是我的了!哈哈”,说完,又把我的MarkWord换了,我看了下,thread字段这次指向了她。

随后的一段时间里,3001号线程大哥和3002号线程小姐姐来来回回给我锁了好几次,不过每次都错开了时间,一直没什么矛盾,直到······

轻量级锁

“糟糕!”,3002号线程小姐姐又来了。

“怎么了?”

“这一回3001这小子还在执行synchronized中的代码,我没法重偏向了”,小姐姐有点不开心的样子。

“那怎么办呢?”,我弱弱的问到。

小姐姐没有理我,在一旁忙碌着。

“总算弄好了,我刚向内务总管线程VMThread提交申请,把偏向锁升级成轻量级锁”,说完小姐姐擦了擦额头的汗。

话音刚落,VMThread大爷就来了,他也伸手准备要换我的MarkWord。

image.png

“啊,不行,我被3001号线程大哥锁住了,MarkWord里面写着他的地址呢,你可不要乱改啊”,说完我躲到了一边。

“孩子别怕,3001号线程现在在安全点,被挂起来了,现在有别人也要来锁定你,偏向锁不够用了,咱得升级成轻量级锁。”,VMThread大爷一脸慈祥的说到。

“你们这样背着3001号线程私自改了不会出问题吗?”,我还是有点担心。

“别担心,只是升级一下,并不会改变你的归属。看到3001号线程的栈了吗,我在那里申请到了一个LockRecord,会把你的MarkWord保存过去,LockRecord中的Obj也会指向你。”,大爷继续说道。

“那需要我做什么呢?”

“来,我给你换一个新的MarkWord”,说完就又给我换掉了。我看了一下,lock位变成了00,剩下的位变成了一个指针,刚好指向了他刚刚说的那个LockRecord

image.png

VMThread大爷走后,3002号线程小姐姐开始我旁边转来转去,每过一会儿过来看一眼,就这样来来回回好几次,我终于忍不住了。

“你这是在干嘛啊,在我面前晃来晃去,我头都晕了”

1.gif

“我这是在自旋,等3001号那家伙来释放,话说那家伙怎么还不来”,小姐姐说完看了一眼手里的计数器。

重量级锁

“不行了,不能再等了,白白让我浪费了这么多时间”,小姐姐等得有些生气,“来,我再给你换个MarkWord”

“这怎么又要换了?”,我有点纳闷儿。

“那家伙久等不来,我不能一直这么等着,占着CPU不干活啊,得给你膨胀成重量级锁”,说完,小姐姐又执行了一个CAS操作,把我的MarkWord修改了。

我看了一下,这一次,lock位变成了10,剩下的位指向的地方好像不是一个LockRecord。

image.png

“小姐姐,我这MarkWord中指向的是个什么啊?”,我忍不住问到。

“那是一个ObjectMonitor对象,哦,也就是我说的重量级锁啊”,一边说,一边准备了一个ObjectWaiter对象,把自己线程地址放了进去,随后将这个对象放入monitor对象的等待列表中。

“小姐姐,为什么要叫重量级锁呢?”

“因为一会儿我就得去线程切换,交出占用的CPU,让给别人,等你被释放之后我再来,这一来一去的挺折腾的,所以叫重量级锁嘛。好了,小朋友,我得去休息了,回头见”,说完就离开了。

hashcode

小姐姐前脚刚走,又双叒来了一个线程大叔。

“你是不是也要来锁定我啊?”,这一次我先开口了。

“小朋友,你误会了,我要计算下你的HashCode,等下要放到你的MarkWord中”,大叔蹲在一旁手里计算着什么。

image.png

“怎么又要放在MarkWord里,你们就不能换个地方存吗?”,我有点不耐烦了。

“你为什么要说又呢”,大叔问到。

“刚才有几个线程把我的MarkWord改了又改,现在你又要来...”

听完我的话,大叔停下了手里的计算,凑近了看了看我的MarkWord,“呀!lock位是10,你被锁了啊,没事儿,我可以把HashCode保存在ObjectMonitor里面,好了,你继续玩吧,我就不打扰你了”

大叔说完转身离开,留下我独自一个对象,不多时我又睡着了~

未完待续······

彩蛋

不知怎么回事,3001号线程大哥始终未曾过来将我释放,时间就这样一分一秒的流逝。

直到3003号线程的到来,才知道发生了什么······

预知后事如何,请关注后续精彩······

本文关联前作:

一个Java对象的回忆录:垃圾回收

目录
相关文章
|
14天前
|
缓存 Java
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
|
22天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
25天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
45 17
|
25天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
28 6
|
1月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
25天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
24 0
|
1月前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
12 0
|
2月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
31 10
|
2月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
下一篇
无影云桌面