轻量级锁也是一种多线程优化,它与偏向锁的区别在于,轻量级锁是通过CAS来避免进入开销较大的互斥操作,而偏向锁是在无竞争场景下完全消除同步,连CAS也不执行(CAS本身仍旧是一种操作系统同步原语,始终要在JVM与OS之间来回,有一定的开销)。
所谓的无竞争场景,举个例子,就是单线程访问带同步的资源或方法。
偏向锁实现原理
偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步。
如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢复到标准的轻量级锁。(偏向锁只能在单线程下起作用)
通过下图可以更直观的理解偏向锁:
这张图,省略了轻量级锁相关的几处步骤,将关注点更多地聚焦在偏向锁的状态变化上。
偏向模式和非偏向模式 ,在下面的mark word表中,主要体现在thread ID字段是否为空。
挂起持有偏向锁的线程 ,这步操作类似GC的pause,但不同之处是,它只挂起持有偏向锁的线程(非当前线程)。
在抢占模式的橙色区域说明中有提到,指向当前堆栈中最近的一个lock record(在轻量级锁原理一文有讲到,lock record是进入锁前会在stack上创建的一份内存空间)。
这里提到的最近的一个lock record,其实就是当前锁所在的stack frame上分配的lock record。
整个步骤是从偏向锁恢复到轻量级锁的过程。
偏向锁也会带来额外开销
在JDK6中,偏向锁是默认启用的。它提高了单线程访问同步资源的性能。
但试想一下,如果你的同步资源或代码一直都是多线程访问的,那么消除偏向锁这一步骤对你来说就是多余的。事实上,消除偏向锁的开销还是蛮大的。
所以在你非常熟悉自己的代码前提下,大可禁用偏向锁 -XX:-UseBiasedLocking 。
分享到:
相关推荐
很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,...
由于对象头的信息是与对象自身定义的数据没有关系的额外存储成本,因此考虑到JVM的空间效率,Mark Word 被设计成为一个非固定的数据结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间,如32...
在本文中小编给的大家整理了关于Java锁的升级策略 偏向锁 轻量级锁 重量级锁的相关知识点内容,需要的朋友们参考下。
【Java面试】为什么引入偏向锁、轻量级锁,介绍下升级流程.doc
NULL 博文链接:https://eleopard.iteye.com/blog/1746671
使用内建锁(synchronized)进行同步,关键在于要获取指定锁对象monitor对象,当线程获取monitor后才能继续向下执行,否则就只能等待。这个获取过程是互斥的,即同一时刻只有一个线程能够获取到对象的monitor监视器...
偏向锁理论太抽象,实战了解下偏向锁如何发生以及如何升级【实战篇】.doc
为了避免锁膨胀,Java提供了一种称为“偏向锁”的优化策略。偏向锁的主要目的是减少锁竞争,提高并发性能。当一个对象首次被创建时,JVM会自动为其分配偏向锁。此时,如果其他线程试图获取该对象的锁,JVM会将对象头...
一文读懂原子操作、内存屏障、锁(偏向锁、轻量级锁、重量级锁、自旋锁)、Disruptor、Go Context之上半部分.doc
• 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、公平/非公平锁、分段锁、偏向锁,轻/重量级锁)和基本的锁升级策略
Java JDK 8学习笔记 高清,个人的学习使用,共100M。
* [偏向锁](#偏向锁) * [轻量级锁](#轻量级锁) * [自旋锁](#自旋锁) * [自适应自旋锁](#自适应自旋锁) * [锁消除](#锁消除) * [锁粗化](#锁粗化) * [死锁](#死锁) * [如何避免死锁?](#如何避免死锁) * ...
1、本项目则是使用Java实现TCP的Socket网络通信,包含C/S软件架构的程序设计,偏向实践,更加有趣! 2、实现简单有趣的“创意”聊天机器人。 3、建立通信规则: Server和Client之间需要约定相同的规则,保证正常通信...
性能的改善得益于 偏向锁、轻量级锁 的引入,它们具体的实现方式可参考《Java并发编程的艺术》和《深入理解Java虚拟机》这两本书。偏向锁、轻量级锁和重量级锁不同的地方在于不是通过信号量机制(强制阻塞)而是...
使用java模拟synchronzed的过程,模拟从无锁->偏向锁->轻量级锁->重量级锁->挂起->唤醒->继续抢锁,再模拟了各阶段的锁释放。(此代码不能运行,因为很多c++中的机制在java中不能实现)此代码仅用于学习synchronized的...
并用物理学中惯性力的原理分析了产生这种偏向的原因.进而说明了这种偏向是一种视偏向,故产生这种偏向的力――地转偏向力也是一种"视力"、虚构的力.本文还分析归纳了地转偏向力与科氏力的区别和联系。
在翻译过程中,我们尽最大努力保证作品的准确性和可读性,力求在保证语义准确的前提下,尽可能使用通俗易懂的方式向给各位读者介绍Java虚拟机的约束与运作原理。为此目标,我们在专有技术名词、偏僻词中用括号保留...
从思维导图的角度将 Java 关键字 Synchronized进行分析整理,含盖CAS、偏向锁、轻量级锁、重量级锁及锁升级,同时附加了常见问题整理
1.偏向锁 2.轻量级锁 3.锁的优缺点对比
偏向锁 轻量级锁 自旋锁 自适应自旋锁 重量级锁 synchronized 可重入锁 土方法实现可重入锁 使用AQS类实现可重入锁 CAS MySQL 中的行级锁、表级锁和页级锁 java中的死锁 公平锁和非公平锁 锁的总结 锁的优化 ..........