Synchornized的抢锁逻辑

Synchronized关键字在Java中是用来控制对某个对象或方法的并发访问的一种机制。它可以用来给对象或方法加锁,确保在同一时刻只有一个线程可以执行被synchronized保护的代码块或方法。

synchronized的抢锁逻辑:

  1. 锁的概念:在Java中,每个对象都有一个内置锁(也称为监视器锁)。当一个线程想要执行一个同步代码块或方法时,它必须先获得对应对象的锁。

  2. 尝试获取锁

    • 如果锁是可用的(即没有其他线程持有这个锁),那么请求锁的线程会获得这个锁,并进入同步代码块或方法执行代码。
    • 如果锁不可用(即已经被其他线程持有),那么请求锁的线程会被阻塞,进入等待状态,直到锁变为可用。
  3. 等待队列:所有尝试进入同步代码块但未能获取锁的线程将会被放入等待队列。当持有锁的线程释放锁时,处于等待状态的线程(们)将有机会获取锁。JVM采用一定的调度算法(比如先到先服务、公平性等)来决定哪个线程下一个获得锁。

  4. 释放锁:当线程完成同步代码块的执行或离开同步方法时,它会释放锁。这使得其他在等待队列中的线程有机会获取这个锁并执行。

公平性和调度:

  • Java的synchronized机制并不保证等待锁的线程获得锁的顺序(即不保证公平性)。JVM的具体实现和版本可能会影响线程获得锁的顺序。
  • 在某些情况下,为了提高性能和吞吐量,JVM可能会采用非公平的调度策略。

锁的升级和优化:

  • 在JDK 1.6之后,Java虚拟机对synchronized做了很多优化,比如锁偏向、轻量级锁和重量级锁的概念,这些优化可以减少锁竞争的开销,提高并发性能。
  • 锁的状态会根据竞争情况动态升级,从偏向锁开始,轻量级锁,到重量级锁,以适应不同的竞争压力。

总结:

synchronized关键字的抢锁逻辑是通过内置锁(监视器锁)来实现的,涉及锁的获取、等待、释放和可能的锁状态升级。这些机制共同工作以确保在任何时刻,只有一个线程能执行同步代码块,从而保证了线程安全。

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

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

相关文章

Spring面试题总结

1、如何实现一个IOC容器 (1)配置文件包扫描路径; (2)递归包扫描获取.class文件; (3)反射、确定需要交给IOC管理的类; (4)对需要注入的类进行依…

This dependency was not found解决方法

问题如上(前端代码),我是引用js文件出的问题,无法找到api/userManage模块。 解决:没感觉哪有问题,把后面加了个/,就解决了,代表src目录,应该是目录和目录之间应该有/作为分割:

【AUTOSAR】--02 AUTOSAR网络管理相关参数

这是AUTOSAR网络管理梳理的第二篇文章,主要讲解AUTOSAR网络管理的相关参数。第一篇链接【01 AUTOSAR网络管理基础】。​ 相关参数有很多,我挑了一些相对重要的参数,分三部分进行讲解: 第一部分:比较常用&#xff0c…

Excel 面试题及答案(2)

一、VLOOKUP+IF案例: A1 :根据左侧数据源,按姓名匹配《职级》,仅限用函数,不能做任何辅助A2 :根据左侧数据源,按姓名匹配《部门》,仅限用函数,不能做任何辅助A3 :根据右侧考核规则,匹配《绩效比例》,用函数完成(可适当做辅助的单元格区域) =VLOOKUP(F8,IF({1,0},…

二刷代码随想录算法训练营第四天 |24. 两两交换链表中的节点、19.删除链表的倒数第N个节点 面试题 、02.07. 链表相交 、142.环形链表II

目录 一、24. 两两交换链表中的节点 二、19. 删除链表的倒数第 N 个结点 三、面试题 02.07. 链表相交 四、142. 环形链表 II 一、24. 两两交换链表中的节点 题目链接:力扣 文章讲解:代码随想录 视频讲解: 帮你把链表细节学清楚&#xff…

通过傅里叶变换进行音频变声变调

文章目录 常见音频变声算法使用Wav库读写音频文件使用pitchShift算法进行音频变调主文件完整代码工程下载地址常见音频变声算法 在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。常用的算法包括: 1.基于傅里叶变换的频域算法,该类…

渗透工具——kali中cewl简介

一、什么是cewl cewl是一个ruby应用,爬行指定url的指定深度。也可以跟一个外部链接,结果会返回一个单词列表,这个列表可以扔到wpscan等密码爆破工具里进行密码破解。 cewl工具爬取目标网站信息,生成相对应的字典 二、cewl的简单使…

人的各种感觉和智能都具有虚拟化现实的能力

人类的感觉和智能在一定程度上具有虚拟化现实的能力。以下是一些相关观点:感觉的虚拟化现实能力:人类的感觉器官可以受到外界刺激的影响,产生各种感觉体验。然而,人类也可以通过模拟、想象或回忆来创造出虚拟的感觉体验。例如&…

Linux常见指令(2)

目录 1、tar指令 ! 2、bc指令 3、uname 4、重要热键 5、关机 1、tar指令 ! 功能:压缩/解压缩文件或目录,类似zip 我们先来看一下我们的文件即目录,接下来我们输入指令: tar -czf test.tgz test 压缩 -c &#xf…

操作系统-复试笔记

http://t.csdnimg.cn/PJLWh 操作系统基础 什么是操作系统? 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 ,用于…

只需三步即可更改centos7系统语言,centos7系统语言更换,centos7系统中文互换

只需三步即可更改centos7系统语言,centos7系统语言更换,centos7系统中文互换 操作系统:centOS7.8 64位 ssh登录工具:FinalShell FinalShell可以点此下载 先查看系统的默认语言 locale #zh_CN 中文如何验证是中文,可以使用umtui来验证 umtui是一款…

Vue3路由组件练习

Vue3 路由组件练习 演示效果代码分析 安装 vue-router创建路由文件创建路由实例使用 router-link 组件导航 代码实现 index.js 文件App 文件 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令:npm i vue-router 应用插件:Vue.use(VueRouter) 2.2…

C# 中 SQLite 查询数据库表中字段(列)是否存在的方法

查询SQLite数据库表中字段(列)存在的方法 使用SQL语句为:PRAGMA table_info([DeviceTrees]); 其中“DeviceTrees”为数据库表的名称。 使用SQLite Expert Professional工具,查看该语句是否起作用,这里使用的版本是…

神经网络系列---分类度量

文章目录 分类度量混淆矩阵(Confusion Matrix):二分类问题二分类代码多分类问题多分类宏平均法:多分类代码多分类微平均法: 准确率(Accuracy):精确率(Precision)&#xf…

[Linux]文件基础-如何管理文件

回顾C语言之 - 文件如何被写入 fopen fwrite fread fclose fseek … 这一系列函数都是C语言中对文件进行的操作: int main() {FILE* fpfopen("text","w");char str[20]"write into text";fputs(str,fp);fclose(fp);return 0; }而上…

LeetCode2218. Maximum Value of K Coins From Piles——分组背包

文章目录 一、题目二、题解 一、题目 There are n piles of coins on a table. Each pile consists of a positive number of coins of assorted denominations. In one move, you can choose any coin on top of any pile, remove it, and add it to your wallet. Given a …

Linux安装jdktomcatMySQl一战完成

一、jdk安装具体步骤 1、查询是否有jdk java -version 2、进入opt目录 cd /opt/ 连接服务器工具 进入opt目录,把压缩文件上传 查询是否查询成功 进入解压到的目录 cd /usr/local/创建新文件夹 mkdir java 再回到opt目录进行解压 cd /opt 解压到刚刚创建的文…

springboot/ssm高校危化试剂仓储系统Java药剂仓库管理系统web

springboot/ssm高校危化试剂仓储系统Java药剂仓库管理系统web 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:…

Golang Redis:构建高效和可扩展的应用程序

利用Redis的闪电般的数据存储和Golang的无缝集成解锁协同效应 在当前的应用程序开发中,高效的数据存储和检索的必要性已经变得至关重要。Redis,作为一个闪电般快速的开源内存数据结构存储方案,为各种应用场景提供了可靠的解决方案。在这份完…

c语言笔记typedef与输出输入

一typedef 1.1概述 :C 语言提供了 typedef 关键字,可以使用它来为类型取一个新的名字 示例:我们可以看到这里 我们将unsigned char 新起一个名字为 BYTE 后面我们定义此类型的变量的时候就可以使用BYTE typedef unsigned char BYTE;BYTE …