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等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...
随机推荐
- 脚本之美│VBS 入门交互实战
目录 什么是 VBS 第一个 VBS 脚本 msgbox 语法 中文乱码 弹窗交互功能 表白恶搞 什么是 VBS VBS 是一种 Windows 脚本语言,全称是 Microsoft Visual B ...
- 一文吃透 Go 内置 RPC 原理
hello 大家好呀,我是小楼,这是系列文<Go底层原理剖析>的第三篇,依旧分析 Http 模块.我们今天来看 Go内置的 RPC.说起 RPC 大家想到的一般是框架,Go 作为编程语言竟 ...
- vue-cli-serve启动报错
报错信息: > vue-cli-service serve INFO Starting development server... 10% building 2/2 modules 0 acti ...
- 流(stream)如何理解?
前言 如果你搜索输入输出函数,那么你会看到各种各样的流.那么这个流到底是什么东西呢,本文将形象地类比介绍通用的流. 怎样理解通用的流 流,顾名思义就是像水流一样可以流动的事物,可以在不同的领域来去自如 ...
- php 实现CURL请求接口
$ch = curl_init (); //初始化 @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 @curl_setopt($ ...
- 狂神--ElasticSearch
一.ElasticSearch概述 官网:https://www.elastic.co/cn/downloads/elasticsearch Elaticsearch,简称为es,es是一个开源的高扩 ...
- 两个jsp界面之间使用window.location.href使用?传递参数以及接受参数
这篇文章如果能给你带来帮助,不胜荣幸,如果有不对的地方也欢迎批评指正. 网上有很多方法是讲怎么截取字符串啊等等的方法来获取参数,说实话,看着我就觉得费劲,咱们可以换一种思路来思考.一般跳转界面多为前段 ...
- Bugku-不可破译的密码[wp]
一 题目分析 flag.txt cipher.txt (1)密码表形式和维吉尼亚密码一样 (2)看到504Q0304 很容易想到 504B0304 Zip文件头. 二 解题步骤 2.1 解密密文 根据 ...
- 使用Mockito 对方法中的私有void方法
这里用一段代码举例 public void ruleJudgement(Long tenantId, Long productId, Long equipId, List<ModelAttrib ...
- Java通过注解获取方法反射运行
//上下文 @Resource private ApplicationContext applicationContext; @Bean public void test(){ //扫描Control ...