偏向锁实现原理

偏向锁,顾名思义,它会偏向于个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步。

如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢复到标准的轻量级锁。(偏向锁只能在单线程下起作用)

通过下图可以更直观的理解偏向锁:

这张图,省略了轻量级锁相关的几处步骤,将关注点更多地聚焦在偏向锁的状态变化上。

偏向模式和非偏向模式 ,在下面的mark word表中,主要体现在thread ID字段是否为空。

挂起持有偏向锁的线程 ,这步操作类似GC的pause,但不同之处是,它只挂起持有偏向锁的线程(非当前线程)。

在抢占模式的橙色区域说明中有提到,指向当前堆栈中近的一个lock record(在轻量级锁原理一文有讲到,lock record是进入锁前会在stack上创建的一份内存空间)。

这里提到的近的一个lock record,其实就是当前锁所在的stack frame上分配的lock record。

整个步骤是从偏向锁恢复到轻量级锁的过程。

偏向锁也会带来额外开销

在JDK6中,偏向锁是默认启用的。它提高了单线程访问同步资源的性能。

但试想一下,如果你的同步资源或代码一直都是多线程访问的,那么消除偏向锁这一步骤对你来说就是多余的。事实上,消除偏向锁的开销还是蛮大的。

所以在你非常熟悉自己的代码前提下,大可禁用偏向锁 -XX:-UseBiasedLocking 。

java实现偏向锁_Java偏向锁实现原理(BiasedLocking)相关推荐

  1. java轻量级和重量级_Java 偏向锁、轻量级锁和重量级锁

    前言 最开始听到偏向锁.轻量级锁和重量级锁的概念的时候,我还以为是 Java 中提供了相应的类库来实现的,结果了解后才发现, 这三个原来是虚拟机底层对 synchronized 代码块的不同加锁方式. ...

  2. java线程池 锁_java多线程——锁

    这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...

  3. java mysql 分布式锁_Java分布式锁之数据库方式实现

    之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...

  4. java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)

    转自http://www.cnblogs.com/redcreen/archive/2011/03/29/1998801.html 大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的 ...

  5. java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...

    锁的实现 锁的实现其实很简单,主要使用Java中synchronized关键字. public class Lock { private volatile boolean isLocked = fal ...

  6. java细粒度锁_Java细粒度锁实现的3种方式

    最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响.初步的想法是通过数据的时间戳,id等关键字来加锁,从而保证不同类型数据处理的并发性.而java自 ...

  7. java重入锁 自旋锁_java 自旋锁(可重入且无死锁)

    java自旋锁 的实现原理:如果自旋锁被另外一个线程对象持有,那么当前获取锁的线程将陷入while循环等待,直到那个持有自旋锁的线程对象释放它所持有的自旋锁,那么那些想要获取该自旋锁的线程对象 将会有 ...

  8. java key锁_Java细粒度锁实现的3种方式

    转自:http://www.cnblogs.com/wxd0108/p/5488297.html 最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响 ...

  9. java悲观锁_Java乐观锁、悲观锁

    乐观锁 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号 ...

最新文章

  1. 移植uboot第八步:裁剪、修改默认参数、分区
  2. 解密双十一小程序云背后毫秒级伸缩的Serverless计算平台:函数计算
  3. SpringMVC 实例 --非注解【过时的,留作回忆】
  4. C++OpenCV:三角形插值、线面的交点
  5. Linux进阶之Linux中的标准输入输出
  6. 文本比较算法Ⅸ——Primal-Dual算法
  7. 数据库,SQL,万恶之源?
  8. 帆软:像阿甘一样,奔跑在商业智能的赛道上!
  9. 家庭网络布线图与布线方案
  10. 伟大的个性化主页:6种服务可替代iGoogle
  11. 3种方法教你PS快速去掉水印
  12. 【电影推荐】风吹麦浪
  13. 动态磁盘无效的问题怎么解决(包括动态磁盘转为基本磁盘)
  14. 批处理渲染Fbx到Avi视频 BatchRenderFbxToAvi Maxscript插件
  15. 理解JavaScript设计模式
  16. Ubuntu Linux平台安装和使用免费反病毒软件ClamAV
  17. Windows认证机制详解(借物表在文章末尾)
  18. 实验室计算机主机应关闭显示器一般不用关,实验室的计算机主机应关闭,显示器一般不用关闭...
  19. JZOJ-senior-5935. 【NOIP2018模拟10.29】小凯学数学
  20. 不要在条件判断中执行复杂的语句

热门文章

  1. 什么是更适合中国企业的CRM选型标准?
  2. 完美解决PowerPoint 2007无法输入汉字及Office自动调用输入法的问题
  3. C/C++ itoa函数 - C语言零基础入门教程
  4. Cisco-ENSA-网络安全考试测试题
  5. DDoS 攻击与防护(二):DDoS 防护购买和使用入门指南,DDoS 防护服务有哪些应用场景?
  6. 从Nginx优秀的核心架构设计,揭秘其为何能支持高并发
  7. 婚恋交友网站大量吸引风险投资
  8. Linux(九)线程控制
  9. 震撼你的思维:老外是怎么跟我们做生意的(上)
  10. fill和memset函数(C++)