java并发之synchronized实现原理及其优化

1:synchronnized概述

synchronized修饰的方法或代码块相当于并发中的临界区,即在同一时刻jvm只允许一个线程进入执行。synchronized是通过锁机制实现同一时刻只允许一个线程来访问共享资源的。另外synchronized锁机制还可以保证线程并发运行的原子性,有序性,可见性。

2:synchronized的实现原理

Monitor被翻译为监视器或管程
每个Java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针
在这里插入图片描述

刚开始Monitor中Owner为null当Thread-2执行synchronized(obj)就会将Monitor的所有者Owner置为Thread-2,Monitor中只能有一个Owner
在Thread-2上锁的过程中,如果Thread-3,Thread-4,Thread-5也来执行synchronized(obj),就会进入EntryList BLOCKED
Thread-2执行完同步代码块的内容,然后唤醒EntryList中等待的线程来竞争锁,竞争的时是非公平的
注意
synchronized必须是进入同一个对象的monitor才有上述的效果
不加synchronized的对象不会关联监视器,不遵从以上规则

3:为什么要对synchronized进行优化

Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。
在jdk1.5之前,只有synchronized重量级锁,实现需要借助操作系统,是比较消耗性能的操作,在1.6之中为了提高性能,便对synchronized锁进行了优化,实现了各种锁优化技术,如:适应性自旋,锁消除,锁粗化,轻量级锁,偏向锁。

4:轻量级锁

(1):是什么
轻量级锁是jdk1.6中加入的新型锁机制,它名字中的“轻量级”是相对于使用操作系统互斥量来实现的重量级锁而言的。首先需要强调的是,轻量级锁并不是来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统重量级锁使用操作系统互斥量产生的性能消耗。在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀为重量级锁。
(2):上锁的过程
 - 在轻量级锁的执行过程上,在代码进入同步块的时候,如果此同步对象没有被锁定,也就是说此时对象的锁标记位为“01”状态,那么虚拟机首先将在线程的栈帧中建立一个名为锁记录(Lock Record)的空间,内部可以储存锁定对象的MarkWord。

  • 然后虚拟机将使用CAS操作尝试将栈帧中的Lock Record更新为指向该对象的Mark Word的指针,如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象Mark Word的锁标志位将转变位00,即表示此对象处于轻量级锁定状态,
    在这里插入图片描述

  • 如果cas操作更新失败的话
    在这里插入图片描述

  • 对比重量级别的锁:
    如果线程之间不存在锁的竞争,与重量级锁相比,轻量级锁避免使用了互斥信号量,只使用了简单的CAS操作,但如果存在锁竞争,轻量级锁除了使用互斥信号量,还要额外发生CAS操作,因此在有竞争的情况下,轻量级锁会比重量级锁开销更大。

5:锁膨胀

(1):是什么
如果在尝试加轻量级锁的过程中,CAS操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。

(2):如何形成的
在这里插入图片描述
那么当Thread-0去使用CAS去解锁的时候,就不能按原先的步骤进行了,因为现在的锁为重量级锁
在这里插入图片描述

6:自旋锁

自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。但是线程自旋是需要消耗cpu的,说白了就是让cpu在做无用功,如果一直获取不到锁,那线程也不能一直占用cpu自旋做无用功,所以需要设定一个自旋等待的最大时间。
如果持有锁的线程执行的时间超过自旋等待的最大时间仍没有释放锁,这时其他争用线程会停止自旋进入阻塞状态。

7:偏向锁

(1):是什么

Java偏向锁是在jdk1.6中引入的,它的目的是消除数据无竞争情况下的同步原语,进一步提高程序的运行性能。如果说轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量,那偏向锁就是在无竞争的情况下把整个同步都消除连CAS都不做。
偏向锁,顾名思义,它会偏向于第一个访问它的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用锁的情况,则持有偏向锁的线程将永远是不需要在进行同步。
如果运行过程中,遇到其它线程抢占资源,则持有偏向锁的线程会被挂起,jvm会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。

(2):为什么不直接使用轻量级锁

引入偏向级锁是为了减少在无多线程竞争的情况下,尽量减少不必要的轻量级锁执行路径。
因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换线程时,使用CAS操作把获取到这个锁的线程线程的ID记录在对象的Mark Word之中,从而减少性能消耗,不过遇到多线程竞争的情况时就必须撤销偏向锁。
另外一个原因就是,在虚拟机中,大多时候是不存在锁竞争的,常常是一个线程多次获取同一个锁,因此直接使用轻量级锁会增加很多不必要的消耗,所以可以才引入了偏向锁。

(3):偏向锁的使用背景

偏向锁可以提高带有同步但无竞争的程序性能。但是如果程序中大多数锁总是被多个不同的线程访问,那么偏向锁模式就是多余的。

7:总结

在这里插入图片描述

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

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

相关文章

.NET 是信息技术应用创新产业重要参与者

今天是国庆节,也是中秋节,月满中秋,举国欢庆,在这里祝各位开发者中秋国庆快乐。放假在家就想把这几年对于.NET发展相关生态做个梳理,写一篇文章来总结一下这两年从腾讯出来自己创业,推动.NET在国内的应用的…

蓝桥杯- 包子凑数

一:题目 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼,其中第 ii 种蒸笼恰好能放 A_iA i ​ 个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买 XX 个包子,卖包子的大叔就会迅速选出若…

秋天 | 等疫情过后,我们继续背起相机去旅行

这是头哥侃码的第218篇原创2020年,注定是不平凡的一年。八个月前,我正和家人一起沉浸在春节的喜悦中,可没成想一场疫情的到来彻底改变了欢快的气氛。别的倒没什么,只是之前所有的计划全部被打乱了。先说春节假期,和舅舅…

简单理解CAP-BASE

1、CAPCAP是分布式系统的指导理论,是NoSQL数据库的理论基石。CAP其实就是对分布式系统的特性总结,即一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。…

面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?

文章目录[TOC](文章目录)1:解析URL网址,从而生成发送给Web服务器的Http请求信息2:真实地址查询-----(DNS域名解析)3:调用协议栈4:可靠的传输 TCP5:远程定位--IP地址6:两点传输--获取MAC地址7:网卡--出口8:送别者--交换机9:出境大门--路由器10:相互扒皮--服务端与客户端1:解析UR…

C# 中的 is 真的是越来越强大,越来越语义化

一:背景 1. 讲故事最近发现 C#7 之后的 is 是越来越看不懂了,乍一看花里胡哨的,不过当我静下心来仔细研读,发现这 is 是越来越短小精悍,而且还特别语义化,那怎是一个爽字了得????,这一篇就和…

leetcode209. 长度最小的子数组(滑动窗口)

一:题目 二:上码 class Solution { public:/**思路:1.滑动窗口解法1>:确定窗口内是什么2>:确定窗口的起始位置3>:确定窗口的终止位置2.窗口:也就是我们的求的连续字符串的和3.窗口的起始位置: 窗口的起始位置最先是我们数组的起始位置,当窗口内连续数组的和大于targe…

开源特训营 - Lesson 4 - 如何运营社区

编辑:李明康责编:袁睿斌作者:课程助教 - 苏斌主讲教师:庄表伟(开源社理事长)、赵生宇(同济大学)本次课程的主题为《如何运营社区》,主讲者为开源社的理事长庄表伟老师和来…

leetcode904. 水果成篮(滑动窗口)

一:题目 二:上码 class Solution { public:/**思路:滑动窗口1.滑动窗口为我们 两个品种水果的个数2.滑动窗口的起始位置为数组的起始位置,当遇见一个新的水果种类的时候,这时候就需要移动我们的起始位置这里移动起始位置是要注意的,我们需要移动起始到我们的窗口中 完全没有 这…

拥抱.NET 5,从自研微服务框架开始

“ 2016年发布了.NET Core第一个正式版本,而.NET5也将在下个月就正式来临了,技术日新月异,也有点让人应接不暇。在框架设计上,.NET Framework的全家桶理念,培养了一大批的CRUD,而.NET Core转变成了按需使用…

leetcode周赛第一题6037. 按奇偶性交换后的最大数字(冒泡法)

一:题目 二:上码 class Solution { public:int largestInteger(int num) {string str to_string(num);for (int i 0; i < str.size()-1; i) {for (int j i1; j < str.size(); j) {int num1 str[j]-0;int num2 str[i]-0;if (num1%2 num2%2) {//这里我们控制的是奇数…

从零开始打造专属钉钉机器人

一、前言废话不多的实现简单的钉钉机器人。我们分为下面几个步骤来逐步讲解。1.钉钉机器人的类型2.如何打造一个最最简单的钉钉机器人二、钉钉机器人的类型常用的钉钉机器人有两种&#xff0c;1、通知类型的机器人&#xff1a;适合在群内进行一些通知&#xff0c;推荐消息等内容…

Azure 内容审查器之文本审查

内容审查器Azure 内容审查器也是一项认知服务。它支持对文本、图形、视频进行内容审核。可以过滤出某些不健康的内容&#xff0c;关键词。使你的网站内容符合当地的法律法规&#xff0c;提供更好的用户体验。文本内容审核其中文本内容的审核应用比较广泛。比如在审核游戏中的群…

java并发之CAS

文章目录1:何为CAS2:CAS图示3:CAS和Volatile的关系4:为何CAS效率更高一些5:CAS的特点7:受保护得共享数据类型(1):原子基本数据类型(2):原子引用数据类型7:ABA问题(1):什么是ABA(2):如何解决呢&#xff1f;1:何为CAS CAS(Compare And Swap)&#xff0c;即比较并交换。是解决多线…

快速了解 ASP.NET Core Blazor

最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历。面试官&#xff1a;“你刚说你喜欢研究新技术&#xff0c;那你有了解过 Blazor 吗&#xff1f;”作为一位专注于 .NET 开发的软件工程师&#xff0c;你好意思说你对 Blazor 一点也不解吗&#xf…

ASP.NET Core集成Nacos配置中心之适配多格式配置

前言 默认情况下&#xff0c;用nacos-sdk-csharp集成ASP.NET Core的配置系统&#xff0c;是基于JSON格式的数据。随着业务系统的多样化&#xff0c;可能用的配置格式也是各有千秋的。有的会用yaml/yml&#xff0c;有的会用ini&#xff0c;有的会用xml&#xff0c;等等。那么如果…

Git的使用(快速入门)

文章目录[TOC]一:将本地的项目提交到Git上二:GIt的基本操作1:建立一个本地仓库(1):类别(2):创建全新的仓库(3):克隆远程仓库2:查看文件的状态3:在桌面上的文件提交到远程仓库4:在idea中的文件提交到远程仓库5:分支(1):何为分支(2):常用命令(3)注意6:解决合并冲突(1):问题展示(2…

为什么这么忙,还依然做不好事情?

一直都很喜欢《重来》系列&#xff0c;最近出了《重来3&#xff1a;跳出疯狂的忙碌》&#xff0c;第一时间在微信读书中阅读了&#xff0c;让我们印象比较深刻的就是「冷静」和「效率」&#xff0c;本文主要说说效率的问题。书的作者是贾森弗里德&#xff08;Jason Fried&#…

开源特训营 - Lesson 6 - 如何提交一个合格的PR

编辑&#xff1a;李明康责编&#xff1a;袁睿斌作者&#xff1a;课程助教 - 苏斌主讲教师&#xff1a;张齐勋&#xff08;北京大学&#xff09;、赵生宇&#xff08;同济大学&#xff09;本次课程的主题为《如何提交一个合格的PR》&#xff0c;主讲者为来自北京大学的张齐勋老师…

改进程架构,Edge优化浏览器内存问题

微软 Edge 团队称&#xff0c;“今天的浏览器更像是操作系统&#xff0c;而不是文档查看器。用户正在浏览器中执行越来越多的任务&#xff0c;而在桌面应用程序中执行的任务越来越少。与此同时&#xff0c;每个网页、Web 应用程序和扩展程序都在使用内存&#xff0c;这也会使用…