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

代码随想录八股训练营day32

代码随想录八股训练营day32

1、synchronized和lock的区别是什么
(1)synchronized和lock的区别是什么

synchronized和Lock都是Java中用于实现线程同步的手段,synchronized是Java的关键字,基于JVM的内置锁实现,可以用于修饰方法或代码块,使用起来比较简单直接。而Lock是一个接口,是Java提供的显式锁机制,需要手动获取和释放锁,通过实现类(如ReentrantLock)来创建锁对象,然后主动调用锁的获取和释放方法。

(2)特性

synchronized:灵活性相对较低,只能用于方法或代码块。而且synchronized方法一旦开始执行,即使线程被阻塞,也不能中断。没有超时机制,一旦获取不到锁就会一直等待,也没有公平性的概念,线程调度由JVM控制。

lock:提供了更多的灵活性,例如可以尝试获取锁,如果锁已被其他线程持有,可以选择等待或者中断等待。提供了超时获取锁的能力,可以在指定时间内尝试获取锁,也可以设置为公平锁,按照请求锁的顺序来获取锁。

(3)等待与通知:

synchronized:与 wait() 和 notify()/notifyAll() 方法一起使用,用于线程的等待和通知。

lock:可以与 Condition 接口结合,实现更细粒度的线程等待和通知机制。

(4)使用场景:

总结来说,synchronized使用简单,适合锁的粒度较小、竞争不激烈、实现简单的场景。而Lock提供了更多的灵活性和控制能力,适用于需要更复杂同步控制的场景。
2、synchronized和ReentrantLock的区别是什么
(1)synchronized和ReentrantLock都是Java中用于实现线程同步的手段,synchronized是Java的关键字,基于JVM的内置锁实现,可以用于修饰方法或代码块,使用起来比较简单直接。而ReentrantLock是java.util.concurrent.locks包中的一个锁实现,需要显式创建,并通过调用lock()和unlock()方法来管理锁的获取和释放。

(2)特性

synchronized:灵活性相对较低,只能用于方法或代码块。而且synchronized方法一旦开始执行,即使线程被阻塞,也不能中断。没有超时机制,一旦获取不到锁就会一直等待,也没有公平性的概念,线程调度由JVM控制。

ReentrantLock:支持中断操作,可以在等待锁的过程中响应中断, 提供了尝试获取锁的超时机制,可以通过tryLock()方法设置超时时间。可以设置为公平锁,按照请求的顺序来获取锁,提供了isLocked()、isFair()等方法,可以检查锁的状态。

(3)条件变量:

synchronized可以通过wait()、notify()、notifyAll()与对象的监视器方法配合使用来实现条件变量。

ReentrantLock可以通过Condition新API实现更灵活的条件变量控制。

锁绑定多个条件:

synchronized与单个条件关联,需要使用多个方法调用来实现复杂的条件判断。

ReentrantLock可以与多个Condition对象关联,每个对象可以有不同的等待和唤醒逻辑。

(4)使用场景:

总结来说,synchronized适合简单的同步需求,而ReentrantLock提供了更丰富的控制能力和灵活性,适用于需要复杂同步控制的场景。

http://www.lryc.cn/news/420116.html

相关文章:

  • 11.面试题——消息队列RabbitMQ
  • MySQL运维-日志
  • synchronized重量级锁的实现原理是怎样的
  • 探索 GLTF 的世界:3D 内容的未来
  • 【深度学习】【语音】TTS, CM-TTS,TTS扩散模型,论文
  • 【网络协议】网络劫持 - ARP_DNS欺骗篇
  • Linux 系统框架分析(一)
  • Leetcode 剑指 Offer II 090.打家劫舍 II
  • 上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌
  • 学习鸿蒙-应用市场申请签名
  • LayUi插件
  • 使用tailwindcss轻松实现移动端rem适配
  • 2021-11-08 51单片机2位秒表启动清零
  • 谈基于大语言模型的图数据库路径检索
  • XHTML 简介
  • 驱动开发系列10 - Linux Graphics 图形栈介绍
  • Docker快速入门指南
  • VS Code中使用MSVC编译C++程序
  • 四数之和(LeetCode)
  • 学习使用备份软件BorgBackup
  • Java 实现合并两个有序链表:递归与迭代
  • 【每日刷题】Day98
  • 51单片机-LED实验二
  • 批发行业进销存-webview 读取NFC,会员卡 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
  • 博弈dp,CF 731E - Funny Game
  • 基础知识:深入理解MongoDB、MySQL与Redis的应用与实践
  • Reids中List类型、Set类型、SortedSet类型的常用指令
  • K8S Ingress 常用配置
  • 【K8S】K8S架构及相关组件
  • 【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】