大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。
原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。
互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。
为了优化Java的Lock机制,从Java6开始引入了轻量级锁的概念。
轻量级锁(Lightweight Locking)本意是为了减少多线程进入互斥的几率,并不是要替代互斥。
它利用了CPU原语Compare-And-Swap(CAS,汇编指令CMPXCHG),尝试在进入互斥前,进行补救。
本文将详细介绍JVM如何利用CAS,实现轻量级锁。
原理详解Java Object Model中定义,Object Header是一个2字(1 word = 4 byte)长度的存储区域。
第一个字长度的区域用来标记同步,GC以及hash code等,官方称之为 mark word。第二个字长度的区域是指向到对象的Class。
在2个word中,mark word是轻量级锁实现的关键。它的结构见下表
从表中可以看到,state为lightweight locked的那行即为轻量级锁标记。bitfieds名为指向lock record的指针,这里的lock record,其实是一块分配在线程堆栈上的空间区域。
用于CAS前,拷贝object上的mark word(为什么要拷贝,请看下文)。
第三项是重量级锁标记。后面的状态单词很有趣,inflated,译为膨胀,在这里意思其实是锁已升级到OS-level。
在本文的范围内,我们只关注第二和第三项即可。
为了能直观的理解lock,unlock与mark word之间的联系,我画了一张流程图:
在图中,提到了拷贝object mark word,由于脱离了原始mark word,官方将它冠以displaced前缀,即displaced mark word(置换标记字)。
这个displaced mark word是整个轻量级锁实现的关键,在CAS中的compare就需要用它作为条件。
为什么要拷贝mark word?
其实很简单,原因是为了不想在lock与unlock这种底层操作上再加同步。
在拷贝完object mark word之后,JVM做了一步交换指针的操作,即流程中第一个橙色矩形框内容所述。
将object mark word里的轻量级锁指针指向lock record所在的stack指针,作用是让其他线程知道,该object monitor已被占用。
lock record里的owner指针指向object mark word的作用是为了在接下里的运行过程中,识别哪个对象被锁住了。
下图直观地描述了交换指针的操作。
最后一步unlock中,我们发现,JVM同样使用了CAS来验证object mark word在持有锁到释放锁之间,有无被其他线程访问。
如果其他线程在持有锁这段时间里,尝试获取过锁,则可能自身被挂起,而mark word的重量级锁指针也会被相应修改。
此时,unlock后就需要唤醒被挂起的线程。
版权声明:本文为博主原创文章,未经博主允许不得转载。
转自 :http://blog.csdn.net/songylwq/article/details/5585734
相关推荐
Java轻量级ORM框架是Java开发中的一个重要工具,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是繁琐的数据访问代码。ORM(Object-Relational Mapping)框架将对象模型与关系数据库模型进行映射,...
《轻量级人体姿态估计:深度学习在骨骼点检测中的应用》 在现代科技领域,人工智能(AI)的发展正以前所未有的速度推动着各个行业的变革。其中,深度学习作为AI的重要分支,已经在图像处理、自然语言处理以及计算机...
-book-《Java Web轻量级开发面试教程》源代码_java-web-lightweight-development-interview-tutorial
This project is based on Java, is a lightweight ORM model. Only concerned about the Object-Relationl Mapping, therefore more simple and easier to use, easier to control. Key support functions and ...
DrJava is a lightweight development environment for writing Java programs. It is designed primarily for students, providing an intuitive interface and the ability to interactively evaluate Java code. ...
轻量级神经网络概述-Lightweight_Seurs_Network-Review
轻量级Java EE(Lightweight Java EE)则是指那些不依赖于大型应用服务器,而是倾向于使用更小巧、更快速的组件来实现企业应用的技术栈。本实战jar包聚焦于这种理念,旨在提供一个高效、易于维护的开发环境。 Java ...
针对这两个问题,现代UNIX变体系统引入了一系列改进措施,其中最重要的是**线程**和**轻量级进程**(Lightweight Process, LWP)的概念和技术。本篇将深入探讨这两种机制的基本原理、实现细节及其优势与不足。 ####...
在HotSpot中,锁有三种状态:无锁(Unlocked)、偏向锁(Biased Lock)和轻量级锁(Lightweight Lock)。当多个线程尝试访问同一对象时,锁会经历从无锁到偏向锁,再到轻量级锁,最后是重量级锁(Mutex)的升级过程...
这些技术包括自适应自旋(Adaptive Spinning)、锁删除(Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)。 自适应自旋是一种技术,通过多次尝试,...
2. **轻量级锁(Lightweight Locking)**:当多线程竞争同一对象的锁时,如果发现对象尚未被锁定(即没有线程拥有偏斜锁),JVM 会使用 CAS(Compare and Swap)操作尝试将锁升级为轻量级锁。轻量级锁通过在对象头的...
该压缩包文件包含了一个基于深度学习的无场景约束全自动车牌识别系统,主要采用了4种轻量级深度卷积网络(Lightweight Deep Convolutional Neural Networks, 简称LCNNs)来实现高效的车牌检测与识别。源码的实现语言...
JavaME轻量级开发框架LWUIT(Lightweight User Interface Toolkit)是Sun Microsystems(现已被Oracle收购)为Java ME平台开发的一款用户界面工具包。它旨在提供一个高性能、丰富的图形用户界面,使得开发者可以在...
文件名为"LSR.ORM"可能是一个具体的ORM框架或者库,其名称暗示了它可能是"Lightweight Simple ORM"的缩写,设计目标是提供一个简单、轻量级的.NET ORM解决方案。关于LSR.ORM,我们可以推测它可能包含以下组件或特性...
为了应对这一问题,Sun Microsystems(现已被Oracle收购)推出了一款轻量级UI工具包—— Lightweight User Interface Toolkit (LWUIT)。 LWUIT 1.2.1 是该工具包的一个版本,它专注于提供一套强大的、可定制的UI...
本文将深入探讨基于分布式配置中心配置限流参数的Redis轻量级分布式限流组件——lightweight-rate-limiter。该组件旨在帮助开发者实现高效、灵活的限流策略,确保服务的稳定性和性能。 一、限流概念与重要性 限流...
在描述中提到的"LWJGL - 轻量级的Java游戏库",这强调了LWJGL的核心特性之一——轻量化。它不是一款庞大的框架,而是专注于提供基础工具和接口,让开发者能够根据需求自定义实现,降低了对系统资源的需求,提升了...
RFC1777 轻量级目录访问协议 (RFC1777 Lightweight Directory Access Protocol) 本备忘录状态 This memo provides information for the Internet community. It does not specify an Internet standard of any ...
于是,轻量级J2EE开发工具应运而生,GEL(Generic Enterprise Lightweight)便是其中的一员,它的增强版本为开发者带来了更高的效率和灵活性。 GEL工具的设计理念是简化J2EE开发流程,提供快速原型构建和轻量级部署...
在"lightweight-crypto-master"目录下,我们可以找到相关的研究论文、源代码和实验数据,这些都是理解轻量级密码学原语的重要资料。这些文件可以让我们深入了解算法的实现细节、性能评估和安全性分析。对于开发者来...