Lock还是Synchronized怎么选

需要加锁的时候是使用Lock还是synchronized关键字

开头先说结论,需要看加的锁是不是需要超时时间,超时没获取到的取消,这种需要使用Lock,Synchronized不支持超时时间的设置,那么其他的呢,
并发量大的时候使用哪个,并发量小的时候使用哪个,并发量大,竞争激烈优先使用Lock,并发量小的可以使用synchronized

synchronized效率问题

关键字是为了保证原子性的,锁的就是对象,具体锁哪个对象取决于使用位置,主动的synchronized(object)这样就是锁的填入的对象,锁标志存在于对象头里面,
关键字还可以加在方法上,加在成员方法上,等同于synchronized(this),锁的就是本实例对象,加在静态方法上,就是锁的类对象,等同于synchronized(this.class)
原理大致是这样,那么效率问题是怎么说,synchronized之前 加锁原理就是通过底层的monitor enter和monitor exit来进行加锁和释放锁,涉及到系统层面调用,
比较重,在切换的时候耗费较多,后来synchronized 有进行优化效率,引入了几种状态,无锁,偏向锁,轻量级锁,重量级锁,也就是最开始是无锁状态,
有线程使用的时候变为偏向锁,这时候只有一个线程,无竞争,会把对应的线程id存起来,发现线程是偏向的线程就不需要进行再加锁,提高效率,
当第二个线程,第三个线程过来的时候,发现偏向锁的线程id不是自己,就需要加锁,这时候进行cas加锁,尝试一定的次数,这时候如果cas加锁成功,
变为轻量级锁,如果没加锁成功升级为重量级锁,即原来的需要系统调用来加锁。

小问题

轻量级锁即然效率高为啥要升级?
答:因为竞争不到锁如果还一直进行cas,造成cpu空转,浪费资源,也达不到高性能的场景,升级为重量级锁进入等待队列,等前面执行完了,系统执行这个

Lock 原理,为什么可以适应高并发

上面说了synchronized的原理,讲到了轻量级锁使用的cas来进行加锁,效率比较高,但是如果一直空转也不行,需要进入等待队列等待,Lock就处理了这个问题,
Lock的都是基于AQS的工具类进行实现的,AQS底层加锁原理就是cas,cas失败之后,提供了一个双向队列,等同于synchronized的等待队列,等前面执行完,
唤醒自己,AQS前面也有分析过,不进行重复分析,那么很明显,Lock的优势就在于cas获取比较轻量,然后也存在等待队列,让线程休眠,不一直占用cpu,
采用的LockSupport.park方法让线程休眠,LockSupport.unpark 唤醒线程,主要是这里的切换比synchronized轻

总结

Lock更加适合高并发的情况,因为synchronized虽然进行了优化,但是这个锁升级的过程,在遇到高并发的时候都会升级成重量级锁,跟原来没太大的差别,
Lock的性能不随着并发的增高明显降低,更加适应高并发的情况,在竞争度比较低的时候synchronized因为存在偏向锁,偏向锁的效率基本接近无锁,
效率也比较高。

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

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

相关文章

本地Lambda(SAM LI)+ MySQL(Docker)环境构筑注意点

目录构成 mysql8 ├─data ├─logs └─docker├─docker-compose.yml├─.env├─config└─my.cnf .env DB_NAMEtest_db ROOT_DB_PASSroot_password DB_USERtest_user DB_PASStest_password DB_PORT3306 TZAsia/Tokyo docker-compose.yml version: "3.6" ser…

OSI七层模型与TCP/IP四层模型

一、OSI七层模型简述 OSI 模型的七层是什么?在 OSI 模型中如何进行通信?OSI 模型有哪些替代方案? TCP/IP 模型关于专有协议和模型的说明 二、七层模型详解(DNS、CDN、OSI) 状态码DNS nslookup命令 CDN whois命令 …

Java中的异常你了解多少?

目录 一.认识异常二.异常分类三.异常的分类1.编译时异常2.运行时异常 四.异常的处理1.LYBL:事前防御型2.EAFP:事后认错型 五.异常的抛出Throw注意事项 六.异常的捕获1.异常的捕获2.异常声明throws3.try-catch捕获并处理 七.自定义异常 一.认识异常 在Jav…

Python实现FA萤火虫优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

ChatGPT探索:提示工程详解—程序员效率提升必备技能【文末送书】

文章目录 一.人工智能-ChatGPT1.1 ChatGPT简介1.2 ChatGPT探索:提示工程详解1.2 提示工程的优势 二.提示工程探索2.1 提示工程实例:2.2 英语学习助手2.3 Active-Prompt思维链(CoT)方法2.4 提示工程总结 三.文末推荐与福利3.1《Cha…

这几款 idea 插件让效率起飞!

作者:苍何,前大厂高级 Java 工程师,阿里云专家博主,CSDN 2023 年 实力新星,土木转码,现任部门技术 leader,专注于互联网技术分享,职场经验分享。 🔥热门文章推荐&#xf…

【CAD二次开发】标注箭头,获取修改标注箭头图块

常见的的标注箭头有以下种类 public static List<string> ArrowBlock = new List<string>(){" ","_CLOSEDBLANK&

如何选择靠谱的安防监控系统?优秀的安防智能系统应该具备哪些特点?

随着科技的不断进步&#xff0c;安防智能系统变得越来越重要。当前的安防监控市场系统五花八门&#xff0c;用户该如何选择性比价高、功能又靠谱的平台&#xff1f;一个优秀的安防智能系统应该具备哪些特点&#xff1f;今天我们来针对这个话题讨论和分享一下。 1、高效性&…

带你手搓阻塞队列——自定义实现

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是——阻塞队列的自定义实现&#xff0c;通过自定义实现一个阻塞队列&#xff0c;可以帮助我们更清晰、更透彻的理解阻塞队列的底层原理。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章…

Java全栈基础篇--集合

集合 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 特点&#xff1a; 长度不固定&#xff0c;还可以存储不同的数据&#xff08;但是一般都用同一类型&#xff09; 集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数组的长…

EasyAmplicon (易扩增子)-扩增子高通量序列分析软件流程及脚本-详细使用方法——来自刘永鑫团队的秘籍

其他不重要&#xff0c;重要的是方向&#xff0c;资源&#xff0c;还要好用&#xff0c;建议大家先看看论文介绍&#xff1a; https://doi.org/10.1002/imt2.83EasyAmplicon: An easy‐to‐use, open‐source, reproducible, and community‐based pipeline for amplicon data…

Python【走出棋盘】

要求&#xff1a; 某个人进入如下一个棋盘中&#xff0c;要求从左上角开始走&#xff0c; 最后从右下角出来&#xff08;要求只能前进&#xff0c;不能后退&#xff09;&#xff0c; 问题&#xff1a;共有多少种走法&#xff1f; 0 0 0 0 0 0 0 0 0 0 0 0 0 …

软件测试-测试用例案例及思维导图展示

自动售货机的测试用例 一个杯子的测试用例 一支笔的测试用例 朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后&#xff0c;是否有消息提醒; 5.非共同好友点赞后&#xff0c;是否有消息提醒; 6.点击…

[数据结构]深入浅出讲解二叉树-平衡二叉树-左右旋转

树是一种数据结构&#xff0c;单位为Node(节点)。不同于链表的直线排列&#xff0c;树呈现一种自上而下的分层排序规则。 树->数据结构&#xff1a; 单元为Node(节点)->当这样的节点多了 就可以关联出不同的形态 一个父节点有一个左子节点&#xff0c;有…

Java面向对象第九天

精华笔记&#xff1a; 多态&#xff1a;多种形态 意义&#xff1a; 同一个对象被造型为不同的类型时&#xff0c;有不同的功能------所有对象都是多态的 ----对象多态&#xff1a;我、你、水...... 同一类型的引用指向不同的对象时&#xff0c;有不同的实现------所有抽象方法…

uniapp-从后台返回的一串地址信息上,提取省市区进行赋值

1.这是接口返回的地址信息 2.要实现的效果 3.实现代码&#xff1a; <view class"address">{{item.address}}</view>listFun() {let url this.$url.url.positionInfoCompany;let param {page: this.page,limit: this.limit,keyword: this.keyword,};thi…

系统部署安装-Centos7-系统常用工具安装

文章目录 Yum环境安装介绍安装 GCC安装介绍验证安装在线安装离线安装 Yum环境安装 介绍 Yum是Centos操作系统中的一个重要工具&#xff0c;它可以帮助用户方便地管理软件安装和更新&#xff0c;而Y源则是提供这些软件的资源库。在后续在线安装系统时&#xff0c;需要使用到Yu…

大数据(十二):方差分析和参数估计

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对…

服务器环境是什么意思?

服务器环境是指运行在服务器上的软件和硬件配置的组合。它包括操作系统、服务器软件、数据库、编程语言解释器、网络配置以及其他必要的组件和设置。 服务器环境的配置对于应用程序的运行和性能至关重要。以下是一些常见的服务器环境组件&#xff1a; 操作系统&#xff1a;服务…

Python 入门

目录 编译性语言 解释型语言 Python语言介绍 Python安装 配置环境变量 Pycharm安装 Pycharm基本使用 编译性语言 解释型语言 计算机是不能理解高级语言的&#xff0c;更不能直接执行高级语言&#xff0c;它只能直接理解机器语言&#xff0c;所以使用任何高级语言编写的程…