java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁

偏向锁

当锁对象第一次被线程获取时,虚拟机会把对象头的锁状态标志设置为01(即偏向状态),同时,使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中。如果这个CAS操作成功,那么,以后持有这个偏向锁的线程在进入这个锁相关的同步块的时候都不需要进行同步,只需要测试对象头的mark word中是否存储着当前线程的ID。若测试成功,则直接进入同步块。若测试失败,则需要测试mark word中锁状态标志位是否为01。若不为01(即表示对象此时处于轻量级/重量级锁状态),则使用CAS操作竞争锁。若为01(即01表示对象此时处于已偏向状态),则尝试使用CAS将对象头的偏向线程ID改为当前线程ID。

此处,着重讨论mark word中锁状态标志位为01的情况:由于偏向锁采用了一种等到竞争出现才会释放锁的机制(即偏向锁不会主动释放),所以当前线程就会知道锁对象此时(可能)处于竞争状态了。(在全局安全点――没有正在执行的字节码)JVM会首先暂停持有偏向锁的线程,然后检查拥有偏向锁的线程是否存活。若没有存活,则将对象头设置为无锁状态并重新偏向。若线程仍然存活,则持有偏向锁的栈会被执行,遍历偏向锁的锁记录、栈中的锁记录以及对象头的mark word(就是检查持有偏向锁的线程是否还需要持有偏向锁)。若检查结果表明该持有偏向锁的线程不需要持有偏向锁了,则将锁对象恢复为无锁状态并重新偏向。否则表明此时锁对象真的处于竞争状态了,那么偏向锁就会被升级成轻量级锁。

注意:当锁对象开启偏向时mark word中有一个比特位将会被置为1,所以偏向状态和未锁定状态除了其他字段的区别外,在这个比特位上也有区别。

轻量级锁

在代码进入同步块的时候,如果此同步对象没有被锁定,即锁标志位为01,那么JVM会先在当前线程的栈帧中创建一个存储锁对象头中Mark Word拷贝的空间(称为锁记录),同时将锁对象头中的Mark Word复制到锁记录中并加上Displaced前缀(Displaced Mark Word)。

然后,JVM使用CAS将锁对象头中的Mark Word更新为指向锁记录的指针。若更新成功,则当前线程便持有了该对象的锁,并且锁对象的标志位变为00(表示此对象处于轻量级锁定状态)。若更新操作失败了,虚拟机会首先检查对象的Mark Word是否指向当前线程的栈帧,如果是则表明当前线程已经拥有了这个对象的锁,可以直接进入同步块继续执行。如果不是,则当前线程进入自旋,(个人见解,不当之处欢迎指正)则会有两种情况会膨胀为重量级锁: 当前线程自旋期间,有第三个线程来获取锁,则膨胀为重量级锁,标志位被当前线程置为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,当前线程和第三个线程进入阻塞状态;

当前线程自旋超过限定次数,则膨胀为重量级锁,标志位被当前线程置为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,当前线程进入阻塞状态。

如果当前线程自旋的时候没有发生上面两种情况,那么最终它将获得锁对象的轻量级锁。

轻量级锁的解锁也是通过CAS操作进行的,如果对象的Mark Word仍指向线程的锁记录,那么就用CAS把对象当前的Mark Word和线程中的Displaced Mark Word替换回来。若替换成功,则整个同步过程完成,若替换失败,则表明有其他线程竞争过锁,就要在释放锁的同时唤醒被挂起的线程。

参考文献:

1、《深入理解Java虚拟机》,周志明著;

2、《Java并发编程的艺术》,方腾飞,魏鹏,程晓明著;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springmvc 拦截器_Spring MVC拦截器学习

1 介绍Spring Web MVC是基于Servlet API构建的原始Web框架。2 拦截器2.1 定义springmvc框架的一种拦截机制2.2 使用2.2.1 两步走实现HandlerInterceptor接口注册(xml或者注解 )2.2.2 HandlerInterceptor接口实现HandlerInterceptor接口import org.spring…

python如何生成列表和元组数据_Python数据类型(列表和元组)

1.3 List(列表)列表由一系列按特定顺序排列的元素组成。在Python中,用方括号[ ]来表示列表,并用逗号来分隔其中的元素。1.3.1 访问列表元素在Python中,第一个列表元素的索引为0,而不是1。>>> bicycles [trek, cannondal…

mysql socket 与IP区别_MySQL本地用IP登陆而非socket

##想当然的指定hostname和端口。。。。失败[rootmysql01 ~]# /opt/mysql/bin/mysql -uroot -h localhost -P 3307 -pEnter password:ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)##正确方法,指定通信协议 --protoco…

python画矩形函数drawrectangle_Python3 tkinter基础 Canvas create_rectangle 画矩形

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-9-30Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""from tkinter import *def main(…

java文件读入原理_描述一下JVM加载class文件的原理机制

1、JVM 简介JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后会写个复杂点class ,然后再找一些开源框架,比如Spring ,Hibernate 等等,再然后就开发…

python为什么closed_为什么Python无法解析此JSON数据? [关闭] - Why can't Python parse this JSON data? [closed]...

问题:I have this JSON in a file: 我在文件中有此JSON:{"maps": [{"id": "blabla","iscategorical": "0"},{"id": "blabla","iscategorical": "0"}],"…

mysql 缓解竞争热点_MySQL优化之缓存优化

高兴的是有博友mark了我的文章。我知道mark之后,很少会再来继续关注的。但是从侧面说明了在博友点开博客的同时,他感觉这篇博客是有价值的,是能够弥补他的知识欠缺。一篇博客最重要的是对自己有用,如果再对别人有用,那…

python for循环1 到10_python for循环(1)

对于一个初学者来说for循环可能会击溃很多人,因为网上找的python的for循环没有详细的介绍for循环的条件以及for循环后面定义的东西是什么意思。首先我先举一个常用的例子。for i in range(1,10) :print i上面这两条代码是用来在屏幕上打印1到9的。这里就不对range这…

java maven junit_【JUnit】JUnit 与 maven 集成

环境JDK 11JUnit 4.13Spring Tool Suite 4.6.2Maven 3.6.3与 maven 集成因为已经是 maven 项目了,所以不再需要任何东西,默认就与 maven 集成了。不过由于 maven-surefire-plugin 自身的缺陷,导致测试时,如果有中文,则…

最长不重复子串python_python经典算法题:无重复字符的最长子串

题目:无重复字符的最长子串。给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字…

python构造referer_Python爬虫小偏方:修改referer绕开登录和访问频率限制

看官们在写爬虫程序时应该都会遇到如下问题:你的爬虫程序开发时能正常抓取网页,但是正式大量抓取时,抓取的网站总是返回403或者500等;你抓取的网站需要登录,要花大量时间去研究网站登录流程。遇到问题1,我们…

微信流媒体直播java_微信小程序直播带货教程

微信小程序直播带货教程微信小程序正式推出直播带货组件,很多正在使用 “api工厂” 的用户,这几天一直在问,现有小程序如何使用直播带货的功能,需要不需要做很复杂的改动?是否需要重新开发小程序?使用门槛高…

铺砖问题JAVA_java彩色瓷砖编程题分析

牛牛喜欢彩色的东西,尤其是彩色的瓷砖。牛牛的房间内铺有L块正方形瓷砖。每块砖的颜色有四种可能:红、绿、蓝、黄。给定一个字符串S, 如果S的第i个字符是R, ‘G, ‘B或Y,那么第i块瓷砖的颜色就分别是红、绿、蓝或者黄。牛牛决定换掉一些瓷砖的颜色,使得相邻两块瓷砖的颜色均不相…

python灰度图像为什么显示成彩色的_python opencv image 怎么变成伪彩色

匿名用户1级2017-05-16 回答OpenCV 生成 伪彩色图像opencv中没有易用的伪彩色图像生成函数,这里提供一个改造过的函数,利用自定义colorbar 将灰度图像转换成为伪彩色图像,优点在于提供了对于颜色的直观可操控性,转换方便。函数代码…

vue和java实现页面增删改_SpringBoot-Vue实现增删改查及分页小DEMO

前言主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo,实现增删改查、分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程。开发栈前端开发工具:WebStorm开发框架:vue axios包管理工具: npm打包工具&#xff1…

读取24位ad的值_实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值

摘要:一文带你用小熊派开发板动手做土壤湿度传感器。一、实验准备1.实验环境一块stm32开发板(推荐使用小熊派),以及数据线已经安装STM32CubeMX已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431…

java 计算两个时间戳_Java时间戳计算重叠持续时间与间隔

我相信下面的方法给出了你的Joda时间解的等价物。private static final LocalTime START LocalTime.of(18, 0);private static final LocalTime END LocalTime.of(8, 0);public static Duration overlap(ZonedDateTime currentStart, ZonedDateTime currentEnd) {ZonedDateTi…

python ini文件删除修改_如何在INI文件中编写时删除空格 - Python

这是RawConfigParser.write的定义:def write(self, fp):"""Write an .ini-format representation of the configuration state."""if self._defaults:fp.write("[%s]\n" % DEFAULTSECT)for (key, value) in self._defaults…

php 如何守护进程_PHP 如何实现守护进程

PHP 如何实现守护进程发布时间:2020-07-11 15:29:31来源:亿速云阅读:58作者:LeahPHP 如何实现守护进程?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小…

python requests session刷新_Python Requests Session set-cookie不生效的坑

我们知道 Python Requests库 中的 Session 模块有连接池和会话管理的功能,比如请求一个登录接口后,会自动处理 response 中的 set-cookie,下次再请求时会自动把 cookie 带上。但最近出现了一个诡异的事情,cookie 没有自动带上&…