synconized锁升级过程,偏向锁,轻量级锁,重量级锁

2024-06-12 08:04

本文主要是介绍synconized锁升级过程,偏向锁,轻量级锁,重量级锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

synconized锁的升级过程可以清晰地分为三个阶段:偏向锁、轻量级锁(自旋锁)和重量级锁。这个过程是为了优化锁的性能,减少不必要的同步开销。以下是详细的升级过程:

 

1. 偏向锁(Biased Locking)

目的:减少无竞争情况下的同步操作开销。

工作机制:

当一个线程首次访问同步代码块并获取对象的锁时,JVM会在对象的头部(Mark Word)中记录下该线程的ID,标记对象已偏向于该线程。

当该线程再次访问该同步代码块时,JVM会检查对象的头部信息,如果发现偏向的线程ID正是当前线程ID,则直接执行同步代码块,无需进行任何同步操作。

如果偏向的线程ID不是当前线程ID,或者对象未被偏向,则需要进行锁的撤销或升级。

2. 轻量级锁(Lightweight Locking)

目的:尽量避免线程切换的开销。

工作机制:

如果线程A尝试获取一个已经被线程B持有的偏向锁,JVM会尝试撤销偏向锁,升级为轻量级锁。

升级时,JVM会在当前线程的栈帧中创建一个Lock Record(锁记录),并将对象的Mark Word复制到Lock Record中。

然后,线程A会尝试使用CAS(Compare-and-Swap)操作将对象的Mark Word更新为指向Lock Record的指针。

如果CAS操作成功,则线程A获取到轻量级锁,继续执行同步代码块;如果CAS操作失败,则说明有其他线程(如线程B)正在持有该锁,此时线程A会进入自旋等待状态。

自旋等待过程中,线程A会不断尝试获取锁,直到成功或自旋次数达到上限。

3. 重量级锁(Heavyweight Locking)

目的:防止CPU空转,减少系统开销。

工作机制:

如果线程A在自旋等待过程中未能成功获取轻量级锁,或者等待时间超过阈值,JVM会将轻量级锁升级为重量级锁。

升级时,JVM会将未获取到锁的线程(如线程A)阻塞,使其进入等待队列(Wait Set)中等待。

同时,持有锁的线程(如线程B)在释放锁时,会唤醒等待队列中的线程进行竞争。

重量级锁通过操作系统的互斥量(Mutex)来实现,当线程尝试获取锁时,如果锁已被其他线程持有,则该线程会被阻塞,直到持有锁的线程释放锁。

总结

 

synchronized锁的升级过程是一个从偏向锁到轻量级锁再到重量级锁的渐进过程,旨在优化锁的性能和减少不必要的同步开销。在实际应用中,我们应该尽量避免出现重量级锁的情况,以减少线程切换和阻塞的开销。

这篇关于synconized锁升级过程,偏向锁,轻量级锁,重量级锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053647

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

macOS升级后SVN升级

问题 svn: error: The subversion command line tools are no longer provided by Xcode. 解决 sudo chown -R $(whoami) /usr/local/Cellar brew install svn

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

JeecgBoot 升级springboot版本到2.6.0

1. 环境描述 Jeecgboot 3.0,他所依赖的springboot版本为2.3.5Release,将springboot版本升级为2.6.0。过程全纪录,从2开始描述。 2. 修改springboot版本号 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.