当前位置:网站首页>多线程中 synchronized 锁升级的原理是什么?
多线程中 synchronized 锁升级的原理是什么?
2022-07-26 22:49:00 【识时务者-HJJ】
多线程中 synchronized 锁升级的原理是什么?
synchronized 锁升级原理
在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
锁的升级的目的
锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。
产生死锁的四个必要条件
1) 互斥条件:一个资源一次只能被一个进程访问。
2) 请求与保持: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3) 不可剥夺:进程已获得的资源,在未使用完之前,不得强行剥夺。
4) 循环等待:若干进程之间形成一种头尾相接的循环等待资源关系。
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。
关于线程上下文切换
上下文切换
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换会这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

由于经费有限,购买的云服务器为1核2G的,核心为1即在任意时刻只能被一个线程使用,运行多线程会造成上下文切换,因此无法实现并行的效果,单核心运行多线程导致线程上下文切换可能会导致执行效率还没有单线程高,所以不建议在项目中使用多线程。
我的学习论坛
HandsomeForum:用Java编写的学习论坛,打造我们自己的圈子!(http://huangjunjie.vip:66)
文章链接(多线程中 synchronized 锁升级的原理是什么?):http://huangjunjie.vip:66/question/read/nt2pn5mojclyvag1vv
文章链接(关于线程上下文切换):http://huangjunjie.vip:66/question/read/qs7ho1rcy8jqhapi9m
边栏推荐
- OSPF静态大实验
- Lora光照传感器节点数据采集
- Test and open basic daily question brushing (continuous updating...)
- Solution: various error reports and pit stepping and pit avoidance records encountered in the alchemist cultivation plan pytoch+deeplearning (I)
- Three methods that can effectively fuse text and image information -- feature stitching, cross modal attention, conditional batch normalization
- 通过对射式红外传感器计次实验讲解EXTI中断
- Introduction to STM32 lesson 1
- C language implementation of the small game [sanziqi] Notes detailed logic clear, come and have a look!!
- C语言——while语句、dowhile语句、for循环和循环结构、break语句和continue语句
- (前缀和/思维)Codeforces Round #806 (Div. 4)F. Yet Another Problem About Pairs Satisfying an Inequality
猜你喜欢

数字芯片的面积优化:第三届“华为杯”研究生创芯大赛数字方向上机题1详解

HCIA静态路由综合实验

Tcp的三次握手与四次挥手

OSPF configuration in mGRE environment and LSA optimization - reduce the amount of LSA updates (summary, special areas)

Codeforces Round #796 (Div. 2), problem: (1688C) Manipulating History

Lora通信应用开发

Brief introduction of VLAN principle and specific experimental configuration

Introduction to STM32 lesson 1
npm报错, Error: EPERM: operation not permitted, mkdir

HCIA (network elementary comprehensive experimental exercise)
随机推荐
ospf协议概述以及基础概念
6.28 Dahua written examination
HCIA静态路由基础模拟实验
Text to image paper intensive reading rat-gan: recursive affine transformation for text to image synthesis
7.8 Ruijie online written examination
2022 open source work of the latest text generated image research (papers with code)
Dynamic routing rip protocol experiment
NB-IOT接入云平台
About unsafe problems such as fopen and strError encountered in vs2022 or advanced version running environment
(前缀和/思维)Codeforces Round #806 (Div. 4)F. Yet Another Problem About Pairs Satisfying an Inequality
第五讲—按键控制LED
Tcp的三次握手与四次挥手
Lora通信应用开发
JS 99 multiplication table
OSPF basic configuration application (comprehensive experiment: interference election default routing area summary authentication -- interface authentication)
最新C语言入门与进阶 -史上最全最详细的C语言教程!! 第一节-总览C语言概括
Text to image intensive reading df-gan:a simple and effective baseline for text to image synthesis
Golang — 解析 yaml 文件
npm报错, Error: EPERM: operation not permitted, mkdir
NAT network address translation experiment