【Java核心能力】为什么不建议在高并发场景下使用 synchronized?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

Java核心能力

在这里插入图片描述

为什么不建议在高并发场景下使用 synchronized?

这首先我们要了解 高并发场景的特点 以及 synchronized 底层加锁的原理 是怎样的!

首先说一下 synchronized 底层加锁的原理:

synchronized 在 JDK1.6 之后引入了锁的优化,随着多线程竞争的激烈程度不同,使用的锁也不同

  • 当没有线程竞争,此时为 无锁 状态

  • 如果只有一个线程不停访问同步代码块,此时会使用 偏向锁

  • 如果有两个以上线程并发访问,偏向锁会撤销,并升级为 轻量级锁 (偏向锁在 JDK15 之后就被废弃了,因为撤销带来性能开销比较大)

  • 如果在轻量锁 CAS 自旋达到一定次数还没有拿到锁,就会撤销轻量级锁,升级为 重量级锁 ,其实重量级锁的开销是比较大的,因为底层涉及到

在高并发场景下,并发度肯定是比较高的,不建议使用 synchronized 的原因主要有以下几点:

  • 由于并发度比较高,因此 synchronized 一定会升级到重量级锁,但是重量级锁的性能是不太高的,因为线程要阻塞再唤醒,需要用户态和内核态之间切换
  • synchronized 没有读写锁优化
  • synchronized 不能对线程唤醒,也就是你线程如果获取不到锁的话会一直阻塞

所以如果优化的话,对于第一个点来说,将等待线程阻塞再唤醒,个人感觉优化空间不大

第二个点就是读写锁的优化,读读之间不互斥,大幅度增强 读多写少 场景下的性能!

第三个点就是需要一个 tryLock(timeout) 功能,在指定时间获取不到锁的时候,可以直接将线程超时了,不去拿锁了

  • 为什么说需要 tryLock(timeout) 这个功能呢?

假设这样一种场景,有一个任务在某个时间点可能多个线程同时要来执行,但是只要有一个线程执行完毕之后,其他线程就不需要执行了

那么假设在这个需要执行任务的时间点,大量线程同时过来执行,也就是大量线程都进入阻塞队列等待获取锁,第一个线程拿到锁执行任务之后,此时后边的线程都不需要执行该任务了,但是由于没有这个超时功能,导致后边的线程还需要在队列中等待获取锁,再一个个进入同步代码块,发现任务已经执行过了,不需要自己再执行了,之后再退出同步代码块

因此这个 tryLock(timeout) 的作用就是 将大量线程的串行操作转为并行操作 ,大量线程发现指定时间内获取不了锁了,直接超时,不获取锁了,这样后边的线程再来看就发现任务已经执行过了,不需要再去获取锁执行任务了

image-20240226200621006

这里 tryLock(timeout) 的情况只是举一个特殊的情况,其实是参考了分布式环境下,更新 Redis 缓存时会出现这种情况,但是在分布式环境下肯定不会使用 synchronized ,因此这里主要是举个例子说一下 tryLock 的作用!

上边主要说了 synchronized 的缺点,一方面是为了应对面试,另一方面也可以通过各种问题来引发自己的思考,让自己对 synchronized 的理解更加深入

一般在写项目使用分布式锁还是多一些,毕竟高并发项目肯定不会使用单节点部署

而单机项目的话,一般也不会追求极致的性能,使用 synchronized 也没有什么问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关注国外开源技术文档的中文版的朋友进来看一下

是否还在为技术文档全是英文而烦恼? 是否还在为国外网站访问慢甚至需要翻墙才能查看上面的文档而烦恼? 是否还在为翻译文档晦涩难懂、无法和作者交流而烦恼? 我创建了一个分享技术文档的网站,还在逐步完善,小伙…

大型电商日志离线分析系统(一)

一、项目需求分析 某大型网站日志离线分析系统 1.1 概述 该部分的主要目标就是描述本次项目最终七个分析模块的页面展示。 1.2 工作流 在我们的demo展示中,我们使用jqueryecharts的方式调用程序后台提供的rest api接口,获取json数据,然后…

【PostgreSQL】Windows安装PostgreSQL数据库图文详细教程

Windows安装PostgreSQL数据库图文详细教程 一、前言二、PostgreSQL简介三、软件下载四、安装步骤4.1 安装向导4.2 选择安装目录4.3 选择组件4.4 选择数据存放目录4.5 选择密码4.6 选择端口号4.7 等待安装完成4.8 取消勾选,安装完成 五、启动教程5.1 搜索pgAdmin4&am…

9.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏连接服务器的操作

内容参考于:易道云信息技术研究院VIP课 上一个内容:游戏底层功能对接类GameProc的实现 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:44c54d30370d3621c1e9ec3d7fa1e2a0…

五种多目标优化算法(MSSA、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解过程可以分为以下几个步骤: 1. 定义问题:首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数,这些目标函数可能…

ONLYOFFICE 8.0版本深度测评:革新之作还是失望之作?

引言 : 随着办公自动化需求的不断升级,拥有一款功能全面、操作便捷的办公软件显得尤为重要。在这个背景下,ONLYOFFICE作为一款集文档编辑、表格处理、演示制作等多功能于一体的办公套件,吸引了众多用户的关注。近期,O…

IO进程线程day8作业

信号灯集二次函数封装 sem.c #include<myhead.h>union semun {int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */unsigned short *array; /* Array for GETALL, SETALL */struct seminfo *__buf; /* B…

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

读书笔记之《没有工作的世界》:AI是否会取代人类?

《没有工作的世界—如何应对科技性失业与财富不平等》作者是 [英]丹尼尔苏斯金德&#xff0c; 原作名: A WORLD WITHOUT WORK&#xff1a;Technology,Automation,and How We Should Respond 丹尼尔苏斯金德&#xff08;Daniel Susskind &#xff09;&#xff1a;曾任英国首相战…

jvm面试题目补充

jdk&jre Java程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK&#xff08;Java Development Kit&#xff09;。 把Java API类库中的Java SE API子集 [1] 和Java虚拟机这两部分统称为JRE&#xff08;Java Runtime Environment&#xff09;&#xff0c;JRE是支持…

python学习笔记 - 标准库函数

概述 为了方便程序员快速编写Python脚本程序&#xff0c;Python提供了很多好用的功能模块&#xff0c;它们内置于Python系统&#xff0c;也称为内置函数(Built-in Functions&#xff0c;BlF)&#xff0c;Python 内置函数是 Python 解释器提供的一组函数&#xff0c;无需额外导…

网络层的DDoS攻击与应用层的DDoS攻击之间的区别

DDoS攻击&#xff08;即“分布是拒绝服务攻击”&#xff09;&#xff0c;是基于DoS的特殊形式的拒绝服务攻击&#xff0c;是一种分布式、协作的大规模攻击方式&#xff0c;主要瞄准一些企业或政府部门的网站发起攻击。根据攻击原理和方式的区别&#xff0c;可以把DDoS攻击分为两…

“一代传奇”宗庆后谢幕,500亿元饮料帝国迎交棒时刻

宗庆后同志逝世 2月25日&#xff0c;娃哈哈集团发布讣告&#xff0c;娃哈哈创始人、董事长宗庆后同志&#xff0c;因病医治无效&#xff0c;于 2024-02-25 10:30 逝世&#xff0c;享年 79 岁。 这是一位伟大的企业家。 伟大的地方不仅仅在于&#xff0c;宗庆后 42 岁开始白手起…

【网站项目】437物流管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python字符串访问与拼接你搞懂了吗?

使用下标访问字符串&#xff0c;从0开始计数&#xff0c;-1表示最后一个字符。三种遍历字符串的方法&#xff1a;for循环、len()和enumerate()。字符串拼接只能是字符串之间使用&#xff0c;不能与数字拼接。 1.下标访问字符串 通过下标访问字符串的内容&#xff0c;下标从 0 …

蛋白结构预测模型评价指标

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、蛋白结构预测模型评价指标TM-scorelDDT 二、Alphafold中的评价指标pLDDTpTMPAE 三、AlphaFold-multimer 蛋白结构的评价指标DockQipTM 总结参考资料 前言 本文汇总了AlphaFold和AlphaFold-mul…

C语言函数递归

一、什么是递归 递归实际上就是函数自己调用自己。 递归在书写的时候&#xff0c;有2个必要条件&#xff1a; • 递归存在限制条件&#xff0c;当满足这个限制条件的时候&#xff0c;递归便不再继续。 • 每次递归调用之后越来越接近这个限制条件。 在下面的例子中&#xff0…

将一个 PostgreSQL 数据库复制到另一个数据库中

以管理员身份进入cmd窗口&#xff0c;输入如下命令 语法&#xff1a; pg_dump -C -h 本机IP -U 本机postgresql用户名 源数据库名 | psql -h 服务器IP -U 服务器postgresql用户名 目标数据库名 示例&#xff1a; pg_dump -C -h 127.0.0.1 -U postgres test01-dbname | psql…

leetcode:1925. 统计平方和三元组的数目(python3解法)

难度&#xff1a;简单 一个 平方和三元组 (a,b,c) 指的是满足 a2 b2 c2 的 整数 三元组 a&#xff0c;b 和 c 。 给你一个整数 n &#xff0c;请你返回满足 1 < a, b, c < n 的 平方和三元组 的数目。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;2 解释…

AI绘画丨精美3D立体插图

利用衍纸艺术制作的3D立体精美插图&#xff0c;以星星作为主题&#xff0c;错落在整个画面中&#xff0c;一起看看他的生成关键词吧~ 使用关键词&#xff1a;A gorgeous multi-dimensional paper illustration, paper quilling, 3D diorama of a vintage stargazing illustrat…