前言:
现在同学们对“java同步机制的作用有哪些”大约比较关心,朋友们都需要学习一些“java同步机制的作用有哪些”的相关知识。那么小编在网摘上搜集了一些对于“java同步机制的作用有哪些””的相关文章,希望姐妹们能喜欢,同学们一起来学习一下吧!同步机制的实现原理是什么?
首先需要明确的是,美团的星空next是基于对象实现的。无论使用何种锁,都会在堆内存中创建一个存储数据的空间。
以new 一个mark word为例,它会在堆内存中开辟一片空间。其中存储了三个数据:对象头、实力数据和对象填充。重点查看对象头中包含的信息。展开对象头后,可以看到其中包含mark word、类指针和其他信息。核心要查看的是mark word中存储的内容。展开mark word后,可以在下图中看到锁的状态,以及当前锁被哪个县城持有,并在图中进行标记。
首先看无锁状态。无锁状态下的disk word中存储了哈希值和分代年龄。在最底部用三个比特位标记锁的状态,用一个0表示无锁,一个1表示偏向锁,一个2表示轻量级锁,一个3表示重量级锁。如果当前锁已被某个县城持有,且为偏向锁,则用54个比特位指向该县城。最后三个比特位存储幺零幺,表示当前县城持有或当前锁为偏向锁状态。同时,它还指向一个持有该锁的县城。
当升级为轻量级锁时,最后两个比特位为00,表示轻量级锁,并指向指定虚拟机站或某个县城的虚拟机站中的lock recover,并指向它。此时,该县城持有全天候状态的锁,并且所有信息都存储在站内存中。因为mark word中还存储了哈希值和分代年龄等信息,因此需要在站内存中存储这些信息。
当锁再次升级为重量级锁时,最后两个比特位为110,表示重量级锁。重量级锁将直接指向c加中的实现,即mark word。在这里可以看到一个标记词信息,其中包含了一些核心属性。例如,count代表了竞争锁的线程数量,而owner则需要重点关注。当您持有锁时,会将owner设置为当前持有锁的线程。同时,所有等待竞争锁资源或失败的线程将被放入CXQ单链表和当前NTRY列表的双链表中。当持有锁的线程释放锁资源时,在NTRY中等待的线程将尝试再次竞争该锁资源。
当然,这里还存储了其他信息。毕竟像哈希表这样的对象也存储在当前的对象监视器中。因此,整个锁的实验原理基于对象实现。
首先,需要明确的是,sync是基于对象实现的锁。如何基于对象实现锁呢?因为在对象中会开辟内存空间,存储对象头。而对象头中存储了我的标记词。标记词中标记了我在不同状态下需要存储的信息。例如,对于偏向锁,我可能直接指向我的线程。轻量级锁的信息存储在locker记录中。对于重量级锁,所有信息都存储在刚才看到的Object Monitor中。
在本笔记中,我们将使用Go语言打印标记词中的信息,以验证整个锁状态的变化效果。整个锁状态如下所示,其中信息存储在对象的标记词中。2.5重量锁底层是ObjectMonitl。
标签: #java同步机制的作用有哪些