文章目录

  • 1. 重量级锁的核心原理
  • 2. 重量级锁的开销
  • 3. 代码实例
  • 4. 偏向锁、轻量级锁与重量级锁的对比

1. 重量级锁的核心原理

JVM中每个对象都会有一个监视器,监视器和对象一起创建、销毁。监视器相当于一个用来监视这些线程进入的特殊房间,其义务是保证(同一时间)只有一个线程可以访问被保护的临界区代码块

  • 监视器所保护的临界区代码是互斥地执行的,线程进入临界区代码都需要获得这个许可,离开时把许可归还
  • 监视器提供Signal机制(正持有许可的线程暂时放弃许可进入阻塞等待状态,等待其他线程发送Signal去唤醒 拥有许可的线程可以发送Signal,唤醒正在阻塞等待的线程,让它可以重新获得许可并启动执行)

Hotspot虚拟机中,监视器是由C++类ObjectMonitor实现的, 其有3个比较重要的属性:

  1. Cxq:竞争队列(Contention Queue),所有请求锁的线程首先被放在这个竞争队列中
  2. EntryList:Cxq中那些有资格成为候选资源的线程被移动到EntryList中
  3. WaitSet:某个拥有ObjectMonitor的线程在调用Object.wait()方法之后将被阻塞,然后该线程将被放置在WaitSet链表中

2. 重量级锁的开销

重量级锁会发生线程的上下文切换,从用户态切换到内核态。系统调用是内核态为用户态进程提供的Linux内核态下互斥锁的访问机制,系统调用就会从用户态切换到内核态,这种切换是需要消耗很多时间的,而JVM重量级锁使用了Linux内核态下的互斥锁。


3. 代码实例

package innerlock;import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;public class InnerLockTest {int a=1;double b=1.1;public static void main(String[] args) throws InterruptedException {System.out.println(VM.current().details());Object obj=new Object();new Thread(()->{synchronized (obj) {System.out.println("t1:"+ClassLayout.parseInstance(obj).toPrintable());try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}}).start();Thread.sleep(1000);new Thread(()->{synchronized (obj) {System.out.println("t1:"+ClassLayout.parseInstance(obj).toPrintable());}}).start();Thread.sleep(2000);}
}


上述代码中t1线程先获取到锁,此时是偏向锁,当t1线程还没有离开临界区时,此时线程t2也来抢夺锁资源(t2可能经过多次自旋操作,但是失败了),因此锁升级为重量级锁


4. 偏向锁、轻量级锁与重量级锁的对比



参考:《Java高并发编程卷2》 尼恩

重量级锁的原理与实战相关推荐

  1. 操作系统锁的实现方法有哪几种_java 偏向锁、轻量级锁及重量级锁synchronized原理...

    Java对象头与Monitor java对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的. 对象头包含两部分:Mark Word 和 ...

  2. Java Synchronized 重量级锁原理深入剖析上(互斥篇)

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  3. Java面试题系列(X)锁的原理

    redis实现分布式锁 synchronized 和 reentrantlock的区别,偏向锁/轻量级锁/重量级锁的原理,能否从偏向锁直接升级成重量级锁 转载于:https://www.cnblogs ...

  4. synchronized锁升级之重量级锁

    目录 一.什么是重量级锁? 二.重量级锁的演示 三.重量级锁的原理 四.锁的优缺点对比 一.什么是重量级锁? 当有大量的线程都在竞争同一把锁的时候,这个时候加的锁,就是重量级锁. 这个重量级锁其实指的 ...

  5. synchronized的偏向锁、轻量级锁和重量级锁

    文章目录 Java对象头 偏向锁 批量重偏向 批量撤销 轻量级锁 重量级锁 Monitor 原理 Java对象头 普通对象 Mark Word在64 位虚拟机中的结构为 Mark Word后三(两)位 ...

  6. Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  7. 偏向锁,轻量级锁,重量级锁的核心原理

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章是关于并发编程中偏向锁,轻量级锁,重量级锁的核心原理知识记录. 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中 ...

  8. 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...

  9. Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别

    在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,Java S ...

最新文章

  1. DIY 一套正版、免费、强大的 Visual Studio 2012 IDE
  2. Linux终端字符颜色设置
  3. Oracle varchar2或char类型的byte和char的区别
  4. 重磅!GitHub发布开源负载均衡组件GLB
  5. linux7 重新开始udev,Redhat Linux 7 创建UDEV设备(示例代码)
  6. 活久见!一美国大爷发明了永不掉链子的自行车,垂直踩踏即可驱动
  7. HUE WorkFlow Schedule 调用Hive参数传递,外部参数传递,时间参数传递
  8. 并查集 | 1107
  9. Qt动态映射qobject_cast()
  10. Android 框架揭秘 --读书笔记
  11. cad转dxf格式文件太大_DWG格式怎么转换成DXF格式?实测好用的转换工具都在这了...
  12. 东航建设漏洞管理平台的探索实践
  13. apache+php环境配置
  14. 周立功linux内核,极速搭建周立功IMX287A ARM Linux开发环境
  15. 总会用到的系列2:你不理财财不理你的基金定投
  16. 大道至简(周爱民)第一章读后感-------伪代码
  17. 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告,第 2 部分
  18. python文本分类算法_基于Naive Bayes算法的文本分类
  19. 12生肖 c语言设计,语言十二生肖教案
  20. C语言qsort函数的使用,及自己实现的qsort函数

热门文章

  1. 华为服务器建虚拟机,在服务器上创建虚拟机
  2. 2021云栖大会:阿里云自研技术大爆发,连发多款重磅产品
  3. WEB服务器状态跟踪
  4. CAN分析仪、USBCAN卡连接失败常见问题
  5. poweroff详解
  6. 使用剪映提取视频中的字幕并导出(txt或srt格式)
  7. ODL中RPC接口的restconf化原理
  8. 微信支付--代金券免充值代金券:接口升级
  9. 【DevEco Studio】无法下载ets
  10. 华为网络计算机945,华为升腾GI945 登陆不了