【Java面试】说一说JDK1.6之后对synchronized的优化

news2024/9/22 6:51:57

文章目录

  • 为什么synchronized性能低下?
  • JDK1.6对synchronized的优化
    • 偏向锁(无锁状态)
    • 轻量级锁(自旋)
    • 重量级锁(阻塞)
    • 这些锁的优缺点

早期JDK对synchronized的实现是重量级的,每一次的获取锁都需要请求OS。
而在大部分情况下,同步方法是运行在单线程环境下的,如果每次都调用OS去为我们加锁,那么将严重影响性能。
在JDK1.6中对锁进行了升级。
比如锁粗化,轻量级锁,偏向锁,适应性自旋等技术来减少锁操作的开销。

第一次的时候是一个偏向锁,此时是没有线程争用的情况,只是记录线程ID,此时是没有加锁的。如果有争用情况,那么就要升级为自旋锁,自旋十次,此时如果还没有得到,那么就锁升级为重量锁。

为什么synchronized性能低下?

我们使用的Lock互斥锁,其实底层是由操作系统的mutex lock提供的,而我们编写的临界区代码运行在JVM上,而JVM其实是运行在操作系统上的一个用户程序,而如果想要使用操作系统的mutex lock,那么就需要向操作系统进行申请,此时就会发生从用户态到内核态的切换,这是非常消耗系统资源和性能的。因此如果JDK还继续使用这样的锁自然性能是很低的。而在JDK1.6对synchronized进行优化之后,synchronized的性能提高了很多。
在这里插入图片描述

JDK1.6对synchronized的优化

JDK1.6对synchronized的优化,他将锁分为了三种
偏向锁->轻量级锁->重量级锁(Monitor)

偏向锁(无锁状态)

偏向锁基于CAS实现,他其实是一种无锁状态。为什么呢?
因为偏向锁的条件发生再只有一个线程去访问临界区的时候,此时锁直接被当前线程锁持有,并且设定这个线程的对象头信息中的属性,设定当前锁为当前线程所持有。
之后只要还是这个线程访问临界区,那么只需要比较头信息中的属性是否相等,如果相等则直接获取这把锁。就好像一个人有一个车位,他在车位上面写了纸条设置为小张可用,那么如果它人离开了一会又回来发现,此时车位上面还是写着小张可用,那么他就直接停车进去就行了。所以此时很明显,压根就没有发生竞争,所以此时就是一个无锁状态,也就是偏向锁,此时的锁偏向了某一个线程。

轻量级锁(自旋)

但是不可能一直线程访问临界区把,总不能只有一个线程访问把。所以此时对应的场景就是,有一个小李也要用车位,但是车位其实是公共的呀,总不能你写个条子就给你了把,但是此时小张还停车在里面,所以他就催小张离开,但是小张也不会马上就能离开呀,所以他就需要进行等待,他会每隔一定时间就催一下小张。此时就是自旋锁。这与CAS还是有区别的,CAS一般是一直询问,而自旋锁是隔一段时间问一次。如果好像这是这样子,那好像没有必要升级为重量级锁吧,就让他们等着呗,然后偶尔问一问就好了呀。

重量级锁(阻塞)

但是很明显,如果每一个人都催,那其实停车位的人是很急的,也消耗性能对不。
所以此时如果并发情况严重,那么锁会升级为重量级锁,也就是大家也不催你了,就干等,因为催你我也催不动呀,你也不可能马上就挪车。但是如果车位空出来了,那么其他线程马上就会知道,然后开始进行竞争,谁先抢到就是谁的。(非公平)
所以轻量级锁和重量级锁的区别就在于,是否自旋,是否询问锁的状态。
很明显上面的锁,没有公平,先来的人也未必抢得到,所以就有一个公平锁,那就需要使用队列,先来先得。

这些锁的优缺点

偏向锁:
偏向锁优点在于加锁和解锁不需要额外的消耗,和执行非同步方法基本没什么时间上的差距。
缺点在于如果线程间存在竞争,会带来额外的锁撤消的消耗,因此适用于只有一个线程访问同步代码块的情况。
轻量级锁:
优点在于竟争的线程不会阻塞,提高了程序的响应。
缺点在于如果始终得不到锁的竞争线程,会使用自旋,消耗CPU资源,
因此适用于追求响应时间的场景。
重量级锁:
优点在于钱程竞争不使用自旋,不会消耗CPU。
缺点在于线程阻塞,响应时间缓慢,并且由于是不公平的,可能出现线程饿死或者超时现象。因此适用于追求吞吐量。

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

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

相关文章

若依权限校验源码分析

若依的权限校验实现原理就是AOP自定义注解,代码并不多,debug跟一遍之后很容易理解,详细流程整理如下 用到的类 注解类RequiresLogin、RequiresPermissions、RequiresRoles,分别用于登录认证、权限认证和角色认证切面类PreAuthor…

极米H5评测:极米H5投影仪参数如何?极米H5值得入手吗?

作为家用智能投影领域的佼佼者,极米在上个月结束的双11活动中,实现了全网成交总额破8亿,并获得天猫、京东和抖音投影品类销量和GMV双第一的成绩,同时这也是极米连续第九次成为投影品类冠军。能够实现如此优秀的成绩,也…

JS逆向之webpack 通用扣取思路

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!标题 环境 win10chrome106目标站:aHR0cHM6Ly93d3cuZ205OS5jb20v 加密参数 password: K6YEmQrNy%2FQgdnac…

安卓玩机搞机技巧综合资源------EROFS分区格式 小米红米机型分区类型 刷写recovery方法列举【三】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 💝💝💝&#x1f49d…

高性能数据访问中间件 OBProxy(七):安全、协议和监控

经过本系列前六篇文章的分布式特性介绍,相信大家已经了解了 OBProxy 在 OceanBase 数据库整体架构下的作用。本篇文章我们将换一个视角,介绍一些偏“中间件”的功能:安全、协议和监控功能。 从 OBProxy 整体来看,安全、协议和监控…

Scratch少儿编程英语教程

Scratch少儿编程英语教程 在 Scratch 中学习编程、创建游戏、玩得开心!致未来编码员的家长和老师 课程英文名:Programming for Kids and Beginners Learn to Code in Scratch 此视频教程共5.0小时,中英双语字幕,画质清晰无水印…

网上图书商城小程序毕业设计,微信图书商城小程序系统设计与实现,微信小程序毕业设计论文怎么写毕设源码开题报告需求分析怎么做

功能清单 【后台管理员功能】 会员列表:查看所有注册会员信息,支持删除 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列表,支持删除和修改 广告设置:上传图片和设置小程序首页轮播图广告地…

QT(3)-QTableView

QTableView1 说明2 常用函数2.1 clearSpans2.2 setSpan2.3 columnAt2.4 rowAt2.5 columnSpan2.6 rowSpan2.7 columnViewportPosition2.8 rowViewportPosition2.9 列宽、行高2.9.1 columnWidth2.9.2 rowHeight2.9.3 setColumnWidth2.9.4 setRowHeight2.9.5 resizeColumnToConten…

gitlab结合semantic-release自动化发布npm插件(二)

前言 在内部组织架构开发npm包时,很多人会想到规范问题,难道按前文gitlab结合semantic-release自动化规范git流程(一)所描述根据git的CI/CD就可以了吗,每次发布都会版本对应的新增,而往往新增的版本不是我们所需要的,…

如何去掉视频上的水印文字?视频去水印方法大分享

我们在网上看到喜欢的视频,都会保存下来,经常能够看到保存下来的这些视频中都带有水印。这些带有水印的视频在后期的观看过程中,会很影响整个画面,所以我们在保存下来后,可以选择将视频中的水印去除。那么视频如何去水…

物料管理系统最基本的功能有哪些?

随着企业信息化的快速发展,传统企业的企业快速增长与管理水平、手段滞后之间的矛盾已成为影响企业发展的重要因素和阻碍企业战略目标实现的主要矛盾。尤其是对于一些传统的中小型制造企业企业而言,以往的信息化系统所做的相应规划已经完全不能适用于高速…

【论文阅读32】《Texture Defragmentation for Photo-Reconstructed 3D Models》

目录 1 introduction 2 overview 3 Related work 3.1 Single-patch Mesh Parametrization 3.2 Global Mesh Parametrization 3.3 Signal-Specialized UV Maps 3.4 Mesh repairing 3.5 Alleviating the effect of seams 3.6 Packing of texture charts 4 Phases of the algorith…

初阶数据结构学习记录——열넷 排序(3)

归并排序 归并的思路其实和二叉树,快排都有点像。归并希望左、右半区间有序。和快排不同,先分裂后排序,一半一半分,分到最后每个区间只剩一个1个数字,这个区间一定是有序的,因为只有一个数字,往…

kubernetes的基本使用

文章目录kubernetes的基本使用1、部署方式1、部署方式的演进图2、各部署方式的特点2、架构的简单说明1、架构简图2、各组件说明1、控制平面组件(Control Plane Components)1、kube-apiserver2、etcd3、kube-scheduler4、kube-controller-manager5、cloud…

Apache HTTPD 换行解析漏洞

漏洞介绍: Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。 影响版本:Apache 2.4.0~2.4.29 存在一个解析漏洞;在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策…

Windows中cmd命令窗口一些有用的小技巧命令

使用小功能记录 命令功能help显示所有dos命令,help >> cmd.txt,会把命令输出成文档altprtscreen快速截取命令行窗口esc清除当前命令行tab补全路径,若知道路径开头可快速补全,包含隐藏文件,但文件夹多又不知道路径开始字符时…

scrapy框架了解与使用

scrapy介绍与安装 Scrapy 是开源和协作的一个基于 Twisted 实现的异步处理爬虫框架使用纯 Python 语言编写,被誉为爬虫界的Django,Scrapy 框架应用广泛,常用于数据采集、网络监测,以及自动化测试等 Scrapy安装 mac、linux系统 …

【入门AI】利用Paddle实现简单的数字识别

梳理逻辑 整个流程 准备好Paddle的环境准备好训练样本设计模型(定义模型)训练模型模型测试 1、准备好环境 #加载飞桨和相关类库 import paddle from paddle.nn import Linear import paddle.nn.functional as F import os import numpy as np import matplotlib.pyplot as plt…

集美大学第14届蓝桥校选题解

本次比赛的出题表如下: 退役一年,勋总还是那么强呜呜呜 目录填空题[1] 十甚至九题意思路拓展[蓝桥杯] XXX 进制减法第十三届蓝桥杯C/C省赛B组 E题[2] 九大于十题意思路[3] N皇后签到题[1] JMU最强蓝人[2] 哪有赌狗一直输[3] 元胞自动机题意思路代码实…

PLC程序实例二:ModBusTCP客户端编程实例与测试方法

一、需求描述 1、设备作为服务端时,需要给出对应的测试方法,即要求 PLC 作为客户端,设备作为服务端,因此要求编写 PLC 的ModBusTCP客户端 2、先了解一下设备作为服务端的ModBusTCP网络触发业务逻辑 (1)设…