浅谈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.mzph.cn/news/823122.shtml

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

相关文章

为什么说六西格玛培训公司是企业问题的“终结者”

随着六西格玛管理方法的走红,六西格玛培训公司应运而生,致力于帮助企业解决各种核心问题,实现业绩的飞跃。那么,六西格玛培训公司究竟能为企业解决哪些问题?又为什么说六西格玛培训公司是企业问题的“终结者”呢&#…

深入理解全链路监控:技术驱动的业务保障

全链路监控是一种技术手段,通过监控应用程序从用户请求入口到后端服务的完整调用路径,实现对整个系统性能和健康状况的实时掌握。那么,为什么我们需要全链路监控呢? 为什么需要全链路监控 在传统的单一应用系统中,我…

配电站房黄色灯智能识别:原理与应用---豌豆云

今天豌豆云将深入探讨配电站房黄色灯智能识别的原理及其应用,为大家揭示这一技术在电力系统中的作用。 关键词:配电站房;黄色灯;智能识别;原理;应用 在配电站房的日常运维中,黄色灯作为重要的指示信号,对于运维人员来说具有极高…

第47期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

Spring中事务的详细介绍,附带代码示例

文章目录 1、事务的四大特性2、Spring事务的实现方式3、数据库怎么处理事务4、处理事务的方式4、事务的隔离级别5、事务的超时时间6、事务的传播行为7、Spring事务处理方案1、中小项目使用2、大型项目使用AspectJ框架 4、Spring项目实现事务示例5、SpringBoot项目实现事务示例 …

为什么要将原始数据从bufPtr复制到data中

if (memcpy_s(data DWORD_SERIALIZE_SIZE, sizeNewBuf - DWORD_SERIALIZE_SIZE, bufPtr, size)) {delete[] data;return;} 将原始数据从bufPtr复制到data中是为了构建一个完整的待发送数据包,其中包含了额外的头部信息(如数据大小)&#x…

【第3期】PMC对话标杆用户:兆原数通在SeaTunnel的应用实践

📣随着技术快速发展,企业对数据系统的现代化改造需求日益增加。在这种背景下,如何在保持业务连续性的同时,实现数据系统的平滑迁移与升级呢?加入我们的本期技术访谈节目,来听听李洪军老师分享他们如何利用S…

算法题解记录11+++从前序与中序遍历序列构造二叉树(百日筑基)

题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,…

树莓派驱动开发--iic篇(JY901S陀螺仪的三轴角度简单读取)

前言:既然大家都到了这步,想必对驱动开发有着一定的理解啦吧!!那我在前面说一下流程: 修改编译设备树》》》编写编译驱动文件》》》编写编译app文件》》》ftp挂载将前面3复制到树莓派的对应位置》》》加载驱动模块》》…

2024软件测试自动化框架都有哪些?

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐,必须加快应用程序的交付时间,但不能以牺牲质量为代价。快速实现质量是必要的,因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…

策略者模式(代码实践C++/Java/Python)————设计模式学习笔记

文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类(把行为接口作为类成员)2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C(用到了大量C2.0的知识&…

linux nohup命令启动jar包 如何取消nohup日志打印

你好,如果你想在使用nohup启动jar包时不输出日志,可以将标准输出和标准错误重定向到/dev/null,这样日志就不会显示在终端上了。你可以这样做: 日志目录指向/dev/null系统空文件,不可改其他路径必须dev nohup java -ja…

数据库SQL语言实战(三)

删除操作 本篇文章重点在于SQL中的各种删除操作 题目一 删除表中的学号不全是数字的那些错误数据,学号应该是数字组成,不能够包含字母空格等非数字字符。方法之一:用substr函数,例如Substr(sid,1,1)返回学号的第一位&#xff0…

Claude3与GPT4全面对比

Claude 3是由人工智能公司Anthropic推出的最新大语言模型,一经推出就在学术界和普通用户中引起轰动。Claude 3在逻辑推理、数学、编程、多语言理解和视觉等方面表现出色,被认为全面超越了此前的GPT-4模型。一些用户甚至认为Claude 3展现出了自我意识的迹象,但专家们对此持怀疑态…

C++常考面试题(第二篇)

【题目 16】拷贝构造函数的格式和作用,自动调用拷贝构造函数的几种情形? 格式:没有返回值 函数名和类名相同 参数:const person& 类型引用 作用:逐个给成员变量进行赋值三种情形下会调用拷贝构造函数 (1) 当用一…

Zynq学习笔记--AXI 总线仿真(AXI VIP)

目录 1. 概述 2. Simulation with AXI VIP 2.1 axi_vip_pkg 2.2 design_1_axi_vip_0_0_pkg 2.3 参数指定 3. 实例化注意事项 3.1 名称对应关系 3.2 寄存器地址 3.3 block design 1. 概述 AXI Verification IP(AXI VIP)是一种用于验证AXI总线协议的…

ubuntu配置springboot+vue环境

ubuntu 22.04 配置springbootvuenginx(出码生成)项目环境 准备工作:VMware 系统镜像:ubuntu-22.04.1-live-server-amd64.iso 一、jdk-1.8环境配置 sudo apt-get install openjdk-8-jdk #查看安装版本 java -version安装失败出现以下问题,更…

09 SQL进阶 -- SQL高级处理 -- 窗口函数等

1. 窗口函数 1.1 窗口函数概念及基本的使用方法 窗口函数也称为 OLAP 函数。OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。 为了便于理解,称之为窗口函数。常规的 SELECT 语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某…

Spring @Transactional 注解

官方文档:https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html#:~:textThe%20%40Transactional%20annotation%20is%20metadata,suspending%20any%20existing%20transaction%22). 推荐阅读:https:…

基于springboot实现大创管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现大创管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足,创建了一个计算机管理大创管理系统的方案。文章介…