重量级锁的原理与实战
文章目录
- 1. 重量级锁的核心原理
- 2. 重量级锁的开销
- 3. 代码实例
- 4. 偏向锁、轻量级锁与重量级锁的对比
1. 重量级锁的核心原理
JVM中每个对象都会有一个监视器,监视器和对象一起创建、销毁。监视器相当于一个用来监视这些线程进入的特殊房间,其义务是保证(同一时间)只有一个线程可以访问被保护的临界区代码块
- 监视器所保护的临界区代码是互斥地执行的,线程进入临界区代码都需要获得这个许可,离开时把许可归还
- 监视器提供Signal机制(正持有许可的线程暂时放弃许可进入阻塞等待状态,等待其他线程发送Signal去唤醒 拥有许可的线程可以发送Signal,唤醒正在阻塞等待的线程,让它可以重新获得许可并启动执行)
Hotspot虚拟机中,监视器是由C++类ObjectMonitor实现的, 其有3个比较重要的属性:
- Cxq:竞争队列(Contention Queue),所有请求锁的线程首先被放在这个竞争队列中
- EntryList:Cxq中那些有资格成为候选资源的线程被移动到EntryList中
- 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》 尼恩
重量级锁的原理与实战相关推荐
- 操作系统锁的实现方法有哪几种_java 偏向锁、轻量级锁及重量级锁synchronized原理...
Java对象头与Monitor java对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的. 对象头包含两部分:Mark Word 和 ...
- Java Synchronized 重量级锁原理深入剖析上(互斥篇)
前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...
- Java面试题系列(X)锁的原理
redis实现分布式锁 synchronized 和 reentrantlock的区别,偏向锁/轻量级锁/重量级锁的原理,能否从偏向锁直接升级成重量级锁 转载于:https://www.cnblogs ...
- synchronized锁升级之重量级锁
目录 一.什么是重量级锁? 二.重量级锁的演示 三.重量级锁的原理 四.锁的优缺点对比 一.什么是重量级锁? 当有大量的线程都在竞争同一把锁的时候,这个时候加的锁,就是重量级锁. 这个重量级锁其实指的 ...
- synchronized的偏向锁、轻量级锁和重量级锁
文章目录 Java对象头 偏向锁 批量重偏向 批量撤销 轻量级锁 重量级锁 Monitor 原理 Java对象头 普通对象 Mark Word在64 位虚拟机中的结构为 Mark Word后三(两)位 ...
- Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程
前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...
- 偏向锁,轻量级锁,重量级锁的核心原理
前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章是关于并发编程中偏向锁,轻量级锁,重量级锁的核心原理知识记录. 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中 ...
- 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...
- Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,Java S ...
最新文章
- DIY 一套正版、免费、强大的 Visual Studio 2012 IDE
- Linux终端字符颜色设置
- Oracle varchar2或char类型的byte和char的区别
- 重磅!GitHub发布开源负载均衡组件GLB
- linux7 重新开始udev,Redhat Linux 7 创建UDEV设备(示例代码)
- 活久见!一美国大爷发明了永不掉链子的自行车,垂直踩踏即可驱动
- HUE WorkFlow Schedule 调用Hive参数传递,外部参数传递,时间参数传递
- 并查集 | 1107
- Qt动态映射qobject_cast()
- Android 框架揭秘 --读书笔记
- cad转dxf格式文件太大_DWG格式怎么转换成DXF格式?实测好用的转换工具都在这了...
- 东航建设漏洞管理平台的探索实践
- apache+php环境配置
- 周立功linux内核,极速搭建周立功IMX287A ARM Linux开发环境
- 总会用到的系列2:你不理财财不理你的基金定投
- 大道至简(周爱民)第一章读后感-------伪代码
- 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告,第 2 部分
- python文本分类算法_基于Naive Bayes算法的文本分类
- 12生肖 c语言设计,语言十二生肖教案
- C语言qsort函数的使用,及自己实现的qsort函数