java轻量级锁、重量级锁、可重入锁、偏向锁、自旋锁的概念
1、重量级锁
作为互斥同步的方式,是最基础的锁,其他的锁都是为了减少开销做的优化,重量级锁借助了monitor 对象,monitor对象中有三个区域,分别是entity site、 owner和wait,进程进入同步前首先进入entity区域等待,若owner没有进程,则进入owner区域,若owner区域已经有进程则阻塞等待,owner也可以执行wait进入wait区域,当owner区域的进程执行完毕释放锁后,会唤醒阻塞的进程竞争锁,由于会导致线程的阻塞,则势必会导致用户态到核心态的切换,大大增加了损耗,因此才称为重量级锁。
2、自旋锁
自旋锁就是为了防止线程阻塞所带来的上下文切换损耗,当线程竞争锁失败后,并不阻塞,而是继续请求锁直到锁释放,一般虚拟机设置为10次,可以自己设置,现在虚拟机也可以根据对象使用动态设置,当然自旋过程中也需要占用cpu,因此只使用于多核心的情况下,类似于等红灯的时候不熄火等绿灯。
3、轻量级锁
轻量级锁是在线程没有其他竞争者的情况下的操作,先说一下对象头的构造,对象头的一部分存储的是与对象自身信息无关的信息,被称为markword,包括自身hash码、gc分代年龄等,mark word的32个比特里25个比特存哈希码,4个存分代年龄,2个存锁标记,1个存是否进入偏向锁,当对象被加了轻量级锁后,markword就被拷贝到当前线程,并被替换成指向位置的指针,替换过程要采用CAS操作,如果更新失败则说明有线程在竞争当前对象,锁膨胀成为重量级锁,在解锁时同样要进行CAS操作进行修改,如果失败则说明当前锁已经进入重量级锁,要唤醒等待进程,假如进程A持有当前锁对象,而此时进程B试图获取,则B会将锁修改为重量级锁,虚拟机会建立monitor对象,B进入阻塞或者自旋。
4、偏向锁
偏向锁和轻量级锁一样,都是基于当前进程没有其他进程竞争锁对象时,偏向锁更加乐观,当确定当前锁对象的mark word指向的是自身的指针后,则不进行CAS操作,直接继续使用对象,除非有其他进程竞争才膨胀为重量级锁。
5、可重入锁
当前进程在获取锁对象后,第二次获取对象时若持有锁对象的是自身,则可以继续使用
在锁优化中,若无其他线程竞争锁对象,当有使用到当前锁对象的hashcode时,也会导致锁膨胀
java轻量级锁、重量级锁、可重入锁、偏向锁、自旋锁的概念的更多相关文章
- Java锁的深度化--重入锁、读写锁、乐观锁、悲观锁
Java锁 锁一般来说用作资源控制,限制资源访问,防止在并发环境下造成数据错误 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 Reentr ...
- Java并发-显式锁篇【可重入锁+读写锁】
作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置锁synchronized: 这节我们再介绍下显式锁Lock 显式锁包括:可重入锁ReentrantLock.读写 ...
- 【Java面试】什么是可重入,什么是可重入锁? 它用来解决什么问题?
一个工作了3年的粉丝,去一个互联网公司面试,结果被面试官怼了. 面试官说:"这么简单的问题你都不知道? 没法聊了,回去等通知吧". 这个问题是: "什么是可重入锁,以及它 ...
- Java多线程:synchronized的可重入性
从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...
- Java锁的种类以及辨析(二):自旋锁的其他种类
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
- Java并发(九):重入锁 ReentrantLock
先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.Ree ...
- 浅谈Java中的锁:Synchronized、重入锁、读写锁
Java开发必须要掌握的知识点就包括如何使用锁在多线程的环境下控制对资源的访问限制 ◆ Synchronized ◆ 首先我们来看一段简单的代码: 12345678910111213141516171 ...
- Redis分布式锁—Redisson+RLock可重入锁实现篇
前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...
- 【java并发编程】ReentrantLock 可重入读写锁
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可 ...
- java锁的种类以及辨析(一):自旋锁
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
随机推荐
- 6、Collections工具类
1.Collections工具类介绍 Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等 ...
- mapreduce的使用
mapreduce的使用 以下案例写之前需要导入jar包依赖: <dependencies> <dependency> <groupId>org.apache.ha ...
- FCoE简单介绍
目录 FCoE 使用前提 FCoE FCoE是一种融合网络技术,其目的是将FC帧封装到以太网帧中,实现以太网链路与光纤链路通信的功能. SAN一般指存储区域网络,FC SAN 有光纤组网,IP SAN ...
- vue 获取select选中的当前option所在对象的各种值
- 基于Python的OpenGL 03 之纹理
1. 概述 本文基于Python语言,描述OpenGL的着色器 前置知识可参考: 基于Python的OpenGL 02 之着色器 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者 ...
- 微信小程序与微信公众号之间支付问题解决方案
前言 大家好,我是一名对编程有兴趣的小伙子,IT届称我为xiager,工作中叫我jake 就好了,如果此文对你有帮助希望多多关注哦. 准备 微信公众平台 微信支付平台 微信开放平台 一. 小程序 ...
- 性能提升 40 倍!我们用 Rust 重写了自己的项目
前言 Rust 已经悄然成为了最受欢迎的编程语言之一.作为一门新兴底层系统语言,Rust 拥有着内存安全性机制.接近于 C/C++ 语言的性能优势.出色的开发者社区和体验出色的文档.工具链和IDE 等 ...
- uni-app (uView) select下拉框添加模糊搜索
先看效果: 因为uniapp内置的下拉查询是没有输入模糊搜索的,有的列表选项过多时还是需要这个搜索功能,所以只能自己筛选 (前台.后台两种方法). 下面是代码: <template> &l ...
- [整合] 解决 Dell T640 安装显卡后风扇转速不降低
最近实验室的dell T640服务器安装了新的GPU.但是安装后发现,风扇太吵了,于是开始着手解决风扇转速过高的问题. 试过ipmi,但是不好用. 最后发现使用racadm可以让服务器重新安静下来. ...
- sheet.getLastRowNum()获取行数不准的问题
// 获得总共有多少行int rowNum = 0;//存在样式的空行.会被统计进来.所以主要的问题是要判断是否是空行.for (int num = 1; num <= sheet.getLas ...