当前位置: 首页 > news >正文

26.synchronized和ReentrantLock的区别

  从锁的实现、功能特点、性能这几个方面说明:

1.锁的实现

  • synchronized是Java的关键字,基于JVM实现。(可以用synchronized修饰代码块,实例方法或静态方法。)
  • ReentrantLock是基于JDK的API层面实现的。(一般是lock()和unlock()方法配合try/finally语句块使用。)

2.功能特点

a.获取锁和释放锁方式不同:synchronized会自动加锁和释放锁,当进入synchronized修饰的代码块之后会自动加锁,离开时会自动释放锁;而ReentrantLock需要手动加锁和释放锁。(unlock释放锁的操作一定要放在finally中,否者有可能会出现锁一直被占用,从而导致其他线程一直阻塞的问题。)

b.锁类型不同:synchronized属于非公平锁,而ReentrantLock可以指定是公平锁还是非公平锁。

c.ReentrantLock更灵活:支持响应中断、可实现选择性通知。

(响应中断:ReentrantLock提供了一种能够中断正在等待获取锁的线程的机制,使用lockInterruptibly()获取锁并响应中断指令。而synchronized不能响应中断,也就是如果发生了死锁,使用synchronized会一直等待下去,而使用ReentrantLock可以响应中断并释放锁,从而解决死锁的问题。)

(选择性通知:ReentrantLock可以实现选择性通知(借助Condition接口和NewCondition()方法实现,在一个Lock对象中创建多个Condition实例(对象监视器),线程可以注册在指定的Condition中,signal()方法会唤醒一个等待在该Condition上的线程,而signalAll()方法会唤醒所有等待在该Condition上的线程,从而实现有选择性的线程通知。),而synchronized不行,只能随机唤醒一个线程notify(),或者全部唤醒notifyAll()。)


3.性能

  在JDK1.6锁优化以前,synchronized的性能要比ReentrantLock差,但是从JDK6开始,synchronized增加了适应性自旋,锁消除等,两者之间的性能就差不多了。


相关文章:

  • 初步认识栈和队列
  • 网络安全等级保护:正确配置 Linux
  • 38、Flink 的窗口触发器(Triggers)详解
  • html5网页-浏览器中实现高德地图定位功能
  • 生产制造边角料核算说明及ODOO演示
  • Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)
  • LabelMe下载及关键点检测数据标注
  • 【全开源】海报在线制作系统源码(ThinkPHP+FastAdmin+UniApp)
  • STM32手写超频到128M函数
  • 嵌入式0基础开始学习 ⅠC语言(7)指针
  • 2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享
  • Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器
  • Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”
  • Docker: exec命令浅析
  • Java核心: 脚本引擎和动态编译
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【Leetcode】104. 二叉树的最大深度
  • 2019.2.20 c++ 知识梳理
  • Angular 响应式表单 基础例子
  • dva中组件的懒加载
  • Hibernate【inverse和cascade属性】知识要点
  • Idea+maven+scala构建包并在spark on yarn 运行
  • isset在php5.6-和php7.0+的一些差异
  • Java IO学习笔记一
  • Meteor的表单提交:Form
  • Vim 折腾记
  • Vue 2.3、2.4 知识点小结
  • Web Storage相关
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 测试如何在敏捷团队中工作?
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前嗅ForeSpider中数据浏览界面介绍
  • 微信小程序--------语音识别(前端自己也能玩)
  • 我感觉这是史上最牛的防sql注入方法类
  • 一文看透浏览器架构
  • 译米田引理
  • 阿里云服务器购买完整流程
  • 第二十章:异步和文件I/O.(二十三)
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • # Redis 入门到精通(七)-- redis 删除策略
  • # 达梦数据库知识点
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #1014 : Trie树
  • (20050108)又读《平凡的世界》
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (35)远程识别(又称无人机识别)(二)
  • (C语言)字符分类函数
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (八)Flink Join 连接
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)EXC_BREAKPOINT僵尸错误