浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中,synchronized关键字用于实现线程间的同步,确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后,其他试图访问同一锁的线程将被阻塞,直到锁被释放。

synchronized锁有两种基本形式:

  1. 同步方法:通过在方法声明前加上synchronized关键字,整个方法体被保护,同一时间内只能有一个线程访问该方法。

    public class MyClass {public synchronized void synchronizedMethod() {// 执行同步代码...}
    }
    
  2. 同步代码块:通过synchronized(object)的方式指定一个对象作为锁,只有持有该锁的线程才能执行同步代码块。

    public class MyClass {private Object lock = new Object();public void synchronizedBlock() {synchronized (lock) {// 执行同步代码...}}
    }
    

synchronized锁的升级机制是Java虚拟机(JVM)为了提高并发性能而引入的一种优化措施,它发生在HotSpot虚拟机中,主要包括以下四种状态:

  1. 无锁状态:对象未被任何线程锁定。
  2. 偏向锁(Biased Locking):当只有一个线程访问同步代码块时,会偏向于该线程,仅记录该线程ID,后续该线程进入同步代码块时无需再进行加锁操作。
  3. 轻量级锁(Lightweight Locking):当第二个线程尝试获取偏向锁时,偏向锁失效,转变为轻量级锁。轻量级锁通过CAS(Compare and Swap)操作尝试获取锁,如果获取失败(即已经有其他线程持有了锁),会进行自旋(spin)尝试,短时间内不停尝试获取锁,减少上下文切换的开销。
  4. 重量级锁(Heavyweight Locking):如果自旋一定次数后仍无法获取锁,轻量级锁会膨胀为重量级锁,此时会挂起当前线程,使其进入阻塞状态,等待锁持有者释放锁。重量级锁会消耗更多的系统资源,但它能保证公平性和互斥性。
  5. 4种状态的转换关系如下图所示:
    在这里插入图片描述

这种锁升级机制旨在减少不必要的上下文切换,从而提高程序在多线程环境下的执行效率。在Java 6及以后版本的HotSpot JVM中,默认开启了锁升级优化策略。

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

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

相关文章

计算机系列之操作系统的系统

2、大话操作系统的启动 当按下开机键时,BIOS 就会开始执行 ​ BIOS 就是放在主板上 ROM 里面的一段程序。 ​ ROM Read Only Memory(只能读取的内存) ​ 所以 BIOS 在出厂的时候就可以直接写死在 ROM 里面。 ​ 每次开机的时候&#xff…

牛客网刷题 | BC51 及格分数

描述 KiKi想知道他的考试分数是否通过,请帮他判断。从键盘任意输入一个整数表示的分数,编程判断该分数是否在及格范围内,如果及格,即:分数大于等于60分,是输出“Pass”,否则,输出“…

12.哀家要长脑子了!

1.189. 轮转数组 - 力扣(LeetCode) ​ 方法一: 要注意这个k是可以大于0的,所以旋转数组的时候要一直保证是在1-n的范围内:%实现 把k个元素旋转放到前面,前面n-k个元素是向后移动的。 class Solution { …

【Leetcode每日一题】 动态规划 - 最小路径和(难度⭐⭐)(58)

1. 题目解析 题目链接:64. 最小路径和 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 算法思路梳理: 一、状态表示 在路径类问题中,状态表示通常有两种形式: 从 [i,…

【电控笔记2.2】电流回路+延迟效应

延迟效应的来源以及影响 数字控制系统的delay: 5.4节有介绍T0=0.5TS 低通滤波器的时间常数? 滤波器的传递函数与性能参数

【C/C++笔试练习】read函数、虚拟存储、用户态、线程特点、缺页处理、调度算法、进程优先级、锁的使用、创建进程、不用加减乘除做加法、三角形

文章目录 C/C笔试练习选择部分(1)read函数(2)虚拟存储(3)用户态(4)线程特点(5)缺页处理(6)调度算法(7)进程优先…

java-spring 图灵 04

在Spring框架中,可以使用org.springframework.core.io.support.ResourcePatternResolver接口的resolveBasePackage方法来将指定的基础包解析为用于包搜索路径的模式规范。 例如,如果基础包是com.example.app,则可以使用resolveBasePackage方法…

UE4_动画基础_不同骨骼的动画重定向步骤

学习笔记,仅供参考! 1、导入fbx外部资源,不包含动画,需要使用小白人动画资源。 2、打开Girl_Skeleton。发现骨骼数量不同,要想使用另一个骨骼的动画资源,需要进行不同骨骼的动画重定向。 3、打开小白人骨骼…

基于java+springboot+vue实现的智慧党建系统(文末源码+Lw+ppt)23-58

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统智慧党建管理采取了人工的管理方法,但这种管…

C语言中的结构体:从定义到传递

前言 结构体是C语言中一种重要的数据类型,它允许我们将不同类型的数据组合成一个整体,并以自定义的方式进行操作。通过结构体,我们可以更加灵活地管理和处理复杂的数据结构,从而提高程序的可读性和可维护性。本篇博客将从结构体的…

大数据dolphinscheduler 本地容器化安装

Minio 容器安装 docker run -p 9000:9000 -p 9090:9090 --name minio -d -e "MINIO_ACCESS_KEYminioadmin" -e "MINIO_SECRET_KEYminioadmin" -v D:\SF\DOCKER\minio\data:/data -v D:\SF\DOCKER\minio\config:/root/.minio minio/minio server /da…

【数据分析面试】21.Spotify 音乐数据库搭建(SQL主键和外键)

题目:音乐数据库设计 假设现在你在Spotify工作,你需要设计一个用于存储歌曲元数据的关系型数据库。 数据库要求包括歌曲标题、歌曲长度、歌曲添加到平台的日期、艺术家、专辑、曲目号(在专辑中的顺序)、歌曲的发行年份以及流派等…