面试官:synchronized与Lock有什么区别?

news2024/11/29 8:33:18

作为一名程序员,在求职面试时,不知道你在求职面试时常会遇到关于线程的问题。

张工是一名java程序员,3年多工作经验,有次到一家互联网公司面试软件开发工程师岗位,面试官就问了他这样一个问题。

synchronized与Lock有什么区别?

张工回答得不是很理想,面试官就说,你都工作3年多了,怎么连synchronize和Lock区别都没掌握。

听面试官这么一说,张工顿时不好意思,感觉这次面试估计要黄了。

对于这个问题,我在面试时就曾遇到过,当时回答也不是很理想,今天简单梳理下synchronized与Lock两者之间有什么区别。

我们知道,synchronized与Lock都是锁,synchronized是java中的一个关键字,也就是说是Java语言内置的特性,那么为什么会出现Lock 锁呢。两者之间有什么区别呢。

对于synchronized相信你并不陌生,我们时常会看到有一段代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁。

这里获取锁的线程释放锁会出现下面这两种情况:

  1. 获取锁的线程执行完了该代码块,然后线程释放对锁的占有权;

  2. 线程执行发生异常,此时JVM会让线程自动释放锁。

在这释放锁的过程中,要是获取锁的线程由于要等待IO被阻塞了,但是又没有及时释放锁,那么其他线程只能一直等待,这样就显得很被动,对程序执行效率有很大的影响,用户体验会很差。

这时候Lock就派上用场了,Lock可以不让等待的线程一直无期限地等待下去,比如在一定的时间就能够做到响应中断。

另外,从代码层看,Lock是一个接口

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}

a8994679275fd3d68f6b17b313902b98.png


其中lock()、tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()方法是用来获取锁的。unLock()方法是用来释放锁的。

简单来说,Lock和synchronized有什么区别:

  • Lock是一个接口,而synchronized是Java中的关键字;

  • synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,需要注意的是,在使用Lock时需要在finally块中释放锁;

  • Lock可以让等待锁的线程响应中断,synchronized不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

  • 通过Lock可以知道有没有成功获取锁,synchronized不行。

值得一提的是,Lock有ReadWriteLock支持并发读。

读写锁将对一个资源的访问分成了两个锁,一个ReadLock读锁和一个WriteLock写锁。正因为有了读写锁,Lock才做到了多个线程之间的读操作不会发生冲突。

ddecbc524708419ce92a67ab41b8fba9.png

d9f5df5b8e7b6b9c96810e09dfca837f.png

上面只是对synchronized与Lock两者区别简单的对比,面试时,面试官问这样的问题,synchronized与Lock有什么区别,我想主要是考察求职者对线程并发基础能力的掌握。

在实际应用中,线程以及线程安全性是非常重要,对于这部分内容理解不够深入,而又需要用到生产项目中,遇到问题时很难定位到问题,容易造成损失。

对于一些常见的知识点,面试前建议多复习下。

由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,欢迎交流。

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

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

相关文章

Android APP深度优化—内存映射机制(mmap)

mmap原理 open一个文件,然后调用mmap系统调用,将文件的内容的全部或一部分直接映射到进程虚拟空间中文件存储映射部分;完成映射关系后,mmap返回值是一个指针,进程可以通过采用指针方式读写操作这一段内存;…

vue3 antd项目实战——使用filter实现简单的table表格搜索功能

零基础filter实现最简单的table表格知识调用核心干货下期预告关键字模糊查找(纯前端)关键字模糊查找(前后交互)知识调用 功能实现可能要用到的知识:vue3ant design vuets实战【ant-design-vue组件库引入】vue3项目实战…

MyBatis-Plus删除操作知识点总结

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客MyBatis-Plus中的更新操作&#xf…

移动无线点餐客户端的研究与实现(Java+Android)

目录 1 绪 论 2 1.1 研究的背景及意义 2 1.2 本文主要内容 2 2.1 系统架构 3 2.2 关键技术 3 2.2.1 JDBC 3 2.2.2 Jquery 4 2.2.3 Ajax 4 2.3 开发环境及平台 5 2.3.1 Eclipse 5 2.3.2 MyEclipse 6 2.3.3 Tomcat服务器 6 2.3.4 应用平台Android 7 3 订餐系统分析与设计 9 3.1需…

机器学习:图文详解密度聚类DBSCAN算法(附Python实现)

目录0 写在前面1 密度聚类2 DBSCAN算法3 Python实现3.1 算法复现3.2 可视化实验0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树…

C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见。 比如,创建一个form1,上面放置一个textbox控件,创建一个线程去访问textbox…

3_SpringMVC_执行流程

1DispatcherServlet:前端控制器 用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。 2…

【学习笔记43】JavaScript的事件

JavaScript的事件一、JS的事件1、事件的三要素2、DOM 0级事件绑定3、DOM 2级事件绑定(事件监听)二、浏览器事件三、鼠标事件1. 左键单击:click2. 双击事件:dblclick3.右键事件:contextmenu4. 鼠标按下事件:mousedown5. 鼠标抬起事…

编写Servlet代码获取页面body中json数据

目录 1、在 maven 项目中引入 jackson 2、编写代码 ① 介绍 jackson 提供操作 json 数据的类和方法 ② 确定 json 数据格式,并写出对应的类 ③ 编写servlet代码 3、使用 postman 发送数据观察结果 4、拓展 readValue 方法返回构造对象的过程 本文使用maven项目&…

HTML5详解

文章目录1 网页基本标签1.2 标题标签1.3 段落标签1.4 换行标签1.5 水平线标签1.6 字体样式标签1.7 注释和特殊符号2 图像、超链接、网页布局2.1 图像2.2 超链接标签2.3 块元素和行内元素2.4 网页布局3 列表、表格、媒体元素、iframe内联框架3.1 列表3.2 表格3.3 媒体元素3.4 if…

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

Unity 之 日志解析工具 Android Logcat一,工具集成1.1 注意事项1.2 导入插件二,连接设备2.1 使用USB连接2.2 无线连接三,实用功能介绍3.1 通用介绍3.2 堆栈跟踪工具 -- 解析Bugly捕获报错一,工具集成 Logcat是开发者必备的工具&a…

ps,查看Linux系统进程信息小帮手-尚文网络xUP楠哥

~~全文共852字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! ps命令在Linux系统中非常的常用,主要是帮助我们查看系统进程的详细信息,其中,…

Jetson Nano如何安装 onnxruntime gpu Python包

Jetson Nano 可以直接 pip 安装 cpu 版本的 onnxruntime 用 pypi 的源,直接安装 onnxruntime-gpu 或者 onnxruntime_gpu 都会报找不到对应的架构 aarch64 本来以为要用官方库编译一下 https://github.com/microsoft/onnxruntime 幸运的是,NVIDIA官方帮…

地级市市场化指数+樊纲市场化指数(包含分省、市两份数据)

一、地级市市场化指数 1、数据来源:各省份年鉴以及地级市统计公报 2、时间跨度:1998-2020年 3、区域范围:422(城市和区) 4、指标说明: 依据樊纲市场化各指标,结合各地级市的相关数据算出来…

Typecho中handsome主题如何增加侧边导航栏

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

【心电信号】小波阙值心电信号去噪【含Matlab源码 2188期】

⛄一、小波阈值法去噪概述 电能质量扰动信号的噪声大多以高斯白噪声的形式存在,利用小波变换对信号进行多分辨率分解,由于小波变换具有去除数据相关性的特点,故可以将有用信号与噪声的能量分离开来。信号中有效的信息主要集中在较大的小波系…

【Vue】Vuex-store

Vuex是什么? Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。 像一个仓库一样! 使用Vuex统一管理状态的好处? 1.能够在vuex中集中管理共享的数据,易于开发和后期维护 2.能…

二叉查找树(1)-二叉树-数据结构和算法(Java)

文章目录1 前言1.1 二叉查找树定义1.2 二叉查找树的性质2 基本实现2.1 API2.2 实现代码2.2.1 数据表示2.2.2 查找2.2.3 插入3 分析4 有序性相关方法与删除操作4.1 最大键和最小键4.2 向上取整和向下取整4.2.1 向下取整floor()4.2.2 向上取整ceiling()4.3 选择select()4.4 排名r…

微服务框架 SpringCloud微服务架构 3 Eureka 3.1 提供者与消费者

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构3 Eureka3.1 提供者与消费者3.1.1 一些概念3.1.2 一个问题3.1.3 总结3 Eur…

【Hack The Box】linux练习-- Pit

HTB 学习笔记 【Hack The Box】linux练习-- Pit 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 🍭…