关于锁的面试题

2023-11-11

1.synchronized和ReentranctLock有什么区别?

①底层实现:synchronized是jvm层面的锁,通过monitor对象完成。对象只能在同步代码块和同步方法中调用wait、notify方法。ReentranctLock提供的是API层面的锁。trylock/unlock

②是否可手动释放:synchronized不需要用户手动释放,代码块执行完后自动释放锁占用。

ReentranctLock需要用户调unlock()手动释放,否则会导致死锁。一般通过lock、unlock方法配合try/finally语法块完成。

③是否可中断:synchronized不可中断,除非加锁的代码块报错或正常执行完。ReentranctLock可以中断,通过trylock(long timeout,TimeUnit unit)设置过期时间就ok了。

④是否公平锁:synchronized非公平锁;ReentranctLock可以选非公平锁,也可选公平锁。创建对象时,传入boolean参数就行了。new ReentranctLock(fair)

2.ArrayList线程安全吗?怎么实现线程安全?

不安全!

①非线程安全的修改操作

ArrayList底层基于数组实现,长度固定。如果多个线程同时对ArrayList进行操作(增删改),会导致数据不一致或其他错误。

②不可见问题

多线程环境下,每个线程都有自己的工作内存,这些工作内存与主内存同步可能不及时。如果一个线程修改了集合中某个元素,另一个线程未及时同步这个修改,就会导致数据不一致。

解决方案:

可以考虑使用Vector、CopyOnWriteArrayList。

Vector的公共方法都用synchronized修饰了,因此可以保证线程安全。

CopyOnWriteArrayList底层基于数组实现,它使用一种‘copy-on-write’技术(写时复制)来确保线程安全。每当进行修改时,CopyOnWriteArrayList都会先复制整个数组,然后再进行修改操作,这样就避免了多个线程同时修改同一个数组的问题。

3.乐观锁、悲观锁了解吗?使用场景?

悲观锁:很悲观,因为它认为如果不锁住这个资源,别人(其他线程)就会来抢,就会造成数据结构错误。所以悲观锁为确保数据正确性,会在每次操作数据前,先锁住数据。

实现:synchronized和ReentrantLock锁。必须取到锁才能操作,这就是悲观锁的思想。

使用场景:竞争激烈,即并发量高时,悲观锁更有优势。因为此时若用乐观锁执行更新,频繁失败和重试,极其浪费CPU资源。

乐观锁:很乐观。相对悲观锁。它不锁资源,因为它认为自己在操作资源时不会有其他线程干扰。

为确保数据正确性,在操作之前,先判断在自己操作期间,是否有其他线程访问数据。如果没有,

直接操作;否则,根据业务要求报错或重试。

实现:<1>乐观锁底层依赖的是CAS算法(compare and swap:比较并交换)。所以它在操作之前并不需要获取锁,而是直接读取数据到自己工作内存中操作。

<2>版本号机制。比如在修改数据时加一个字段version,表示该数据的版本号,每当数据被修改,版本号加1。当某个线程查询数据时,将该数据的版本号一起查出来;当该线程更新数据时,判断当前版本号与之前读取的版本号是否一致,如果一致才进行操作。

使用场景:竞争不激烈,即并发量小时,乐观锁优势更大。因为你此时若用悲观锁,会锁住数据资源,其他线程无法访问,影响并发,加锁和释放锁太耗资源了。

4.分布式锁用过吗?怎么实现?

顾名思义,就是分布式系统中使用的锁。它用来解决分布式系统中控制共享资源访问的问题。

①可以使用redis的setNX命令实现,释放锁需要原子操作,可以用lua脚本。

②可以使用Redisson组件实现redis的分布式锁,它可以实现锁的可重入性和锁续命。

③可以使用CP架构的锁,比如zk、consul。高一致性。

5.死锁?如何避免死锁?

死锁:多线程情况下,他们彼此等待对方释放资源,导致所有线程都无法继续执行的情况。

产生原因:

①互斥条件:一个资源只能被一个线程占有,当这个资源被占用后其他线程就只能等待。

②不可剥夺条件:当一个线程不主动释放资源时,那这个资源就一直被当前线程占用。

③请求并持有条件:一个线程已拥有一个资源后,又尝试请求新的资源。

④环路等待条件:产生死锁一定是发生了线程资源环路链。

如何避免?

      改变死锁中的条件呀!

        如③中,让获取了一把锁之后不再请求获取另一把锁。

        ④中,破坏环路等待条件。如下图,线程1释放锁后,再让线程2访问资源。

        

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于锁的面试题 的相关文章

  • 软件测试|使用matplotlib绘制平行坐标系图

    简介 绘制平行坐标系图 Parallel Coordinates Plot 是一种用于可视化多维数据的强大方法 在这篇文章中 我们将介绍如何使用Matplotlib库创建平行坐标系图 以及如何解释和定制这种图表 我们将使用一个示例数据集来演
  • 基于java的学生成绩管理系统设计与实现

    基于java的学生成绩管理系统设计与实现 I 引言 A 研究背景和动机 学生成绩管理系统是一个重要的教育工具 能够帮助学校管理学生的成绩和考试结果 以便更好地评估学生的教育水平和发展潜力 Java是一种广泛应用的编程语言 具有跨平台 高效
  • 基于java的物流信息网系统设计与实现

    基于java的物流信息网系统设计与实现 I 引言 A 研究背景和动机 基于Java的物流信息网系统设计与实现的研究背景和动机 随着互联网的普及和电子商务的快速发展 物流信息网系统已成为现代物流管理的重要组成部分 物流信息网系统能够实现物流信
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 华为OD机试2024年最新题库(Java)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Java 解法 问
  • 史上最全Java面试八股文(带全部答案)2024年最新版

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 最新整理Java面试八股文,大厂必备神器

    在看这篇文章之前 我想我们需要先搞明白八股文是什么 明清科举考试的一种文体 也称制义 制艺 时文 八比文 八股文章就四书五经取题 内容必须用古人的语气 绝对不允许自由发挥 而句子的长短 字的繁简 声调高低等也都要相对成文 字数也有限制 八股
  • 计算机Java项目|基于SSM的篮球系列网上商城设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • Python 文件的复制重命名以及xlsx文件中表格分开保存

    1 需要的头文件 import shutil import os import openpyxl 2 复制文件以及重命名 直接使用shutil库复制 重命名 移动即可 函数封装示例 source path 为全局变量被复制文件路径 dest
  • 春眠不觉晓,Java数据类型知多少?基础牢不牢看完本文就有数了

    俺滴座右铭是不在沉默中爆发 就在沉默中灭亡 一起加油学习 珍惜现在来之不易的学习时光吧 等工作之后 你就会发现 想学习真的需要挤时间 厚积薄发啦 我们知道Java是面向对象的静态型编程语言 在Java的世界里万物皆对象 但我认为是万物皆数据
  • 【固定翼飞行器】用于计算固定翼飞机空气动力学的紧凑涡旋格方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 详解toLowerCase(判断字符串相等)

    一 toLowerCase 函数简介 toLowerCase 是一个在多个编程语言中都存在的字符串方法 它的作用是将字符串中的所有大写字母转换为对应的小写字母 常用于文本处理 搜索和比较等情况 以确保字符串的一致性和非大小写敏感的操作 二
  • 15天学会Python深度学习,我是如何办到的?

    陆陆续续有同学向我们咨询 Python编程如何上手 深度学习怎么学习 如果有人能手把手 一对一帮帮我就好了 我们非常理解初学者的茫然和困惑 大量视频 书籍 广告干扰了大家的判断 学习Python和人工智能 成为内行人不难 为此 我们推出了
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 2024年华为OD机试真题-靠谱的车-Python-OD统一考试(C卷)

    题目描述 程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就直接跳过 其余功能都正常 比如 1 23再多一块钱就变为25 2
  • 【路径规划】基于改进遗传算法求解机器人栅格地图路径规划(Matlab实现实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • sychnorized积累

    sychnorized 1 对象锁 包括方法锁 默认锁对象为this 当前实例对象 和同步代码块锁 自己指定锁对象 2 类锁 指synchronize修饰静态的方法或指定锁对象为Class对象 3 加锁和释放锁的原理 现象 时机 内置锁th
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    目录 一 简介 1 1 什么是幂等 1 2 为什么需要幂等性 1 3 接口超时 应该如何处理 1 4 幂等性对系统的影响 二 Restful API 接口的幂等性 三 实现方式 3 1 数据库层面 主键 唯一索引冲突 3 2 数据库层面 乐
  • RabbitMQ环境配置

    文章目录 安装Erlang 安装RabbitMQ 安装Erlang 下载地址 http erlang org download otp win64 25 3 2 7 exe 安装RabbitMQ 下载地址 https www rabbitm

随机推荐

  • 疯狂的程序员(绝影)

    这是CSDN上连载的小说 很有趣 刚开始学习计算机的那段历史 读起来是那样的熟悉 我也是从那种激动的过程中走过来的 发现有激情来能做成事情 这是最伟大的动力 读读这本书 回忆一下自己的当年 1 汇编代码 平时用的特别少 但是不是应该仔细的研
  • easy excel date 类型解析报错_最新Pandas.read_excel()全参数详解(案例实操,如何利用python导入excel)...

    pandas read excel 的作用 将Excel文件读取到pandas DataFrame中 支持从本地文件系统或URL读取的xls xlsx xlsm xlsb和odf文件扩展名 支持读取单一sheet或几个sheet 以下是该函
  • 【数据集】Python爬取某国内所有航班记录

    一 分析数据集 我们需要获取航班的数据集合 dcity acity airlineName flightNumber airportName departureDate arrivalDate punctualityRate price 航
  • 一言以蔽之

    其上申韩者 其下必佛老 这句的意思是 统治者如果采用法家式的高压态势治理国家 那么民众就只能从道家和佛家里寻找心理安慰了 也就是道家和佛家为专制权力之下的人提供了一种虚假的逃避方式 菜根谭 作者糅合了儒家的中庸 道家的无为 释家的出世和自身
  • BEPS生态过程模型简介和使用

    一 BEPS模型发展简介 二 BEPS模型代码和参数简介 代码链接 link 模型运行 待更新
  • 在vue项目中设置网站图标

    怎么在我们的Vue项目中设置自定义的网站图标 首先我们需要先制作个ico图标 大小为32 32的 放到static文件夹下 附制作网站 我们把制作好的ico图片改名为 favicon ico 注 必须改名 放到我们项目中的static文件夹
  • softmax分类器 python实现

    转自 http blog csdn net wds2006sdo article details 53699778 utm source itdadao utm medium referral 算法 算法参考的是Andrew 的课件与这篇文
  • Android中获取View宽高方法

    今天遇到一个问题 就是view获取宽度 高度都为0的问题 其实这个大家都遇到过 这里转载别人的 大家好共同学习 本文转载于 http www jianshu com p f56c92e29dea Android开发中经常需要获取控件的宽高
  • FileZilla的下载与安装

    FileZilla的下载与安装 为什么要使用FileZilla进行文件互传呢 Windows下 FileZilla客户端下载与安装 1 FileZilla的下载 1 FileZilla的安装 1 双击运行安装包 点击 i agree 2 n
  • Shader中的一些专业用语的解释

    Shader中的一些专业用语的解释 此文章收录于我主页顶置的 Unity Shader入门精要文章目录 点击即可跳转 一 什么是OPenGL DirectX 简单的来说 就是图像应用编程的接口 这些接口用语渲染二维和三维的图形 架起了上层应
  • 【毕业设计】基于单片机的桌面炫酷律动灯条 -物联网 嵌入式 单片机

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • 公办幼儿园教师要涨工资了???

    终于盼到这一天了 已在市区公办园上班3年多却一直没有编制的季馨 听说从明年开始要涨工资了 高兴坏了 记者从日前召开的全市学前教育工作会议上获悉 从2012年起 确保市区公办幼儿园中具有国家教师资格的聘用教师最低工资水平不得低于当地最低工资标
  • 蓝桥杯 问题 1083: Hello, world!(C/C++ vector实现)

    问题 1083 Hello world 时间限制 1Sec 内存限制 64MB 提交 944 解决 476 题目描述 This is the first problem for test Since all we know the ASCI
  • 《一周搞定模电》—功率放大器

    系列文章目录 文章目录 系列文章目录 前言 一 功率放大电路三极管的工作模式 二 功率放大器内部结构 前言 功率放大器指一种以输出较大功率为目的的放大电路 特点 输出电压大 输出电流大 放大电路的输出电阻与负载匹配 电压放大器和功率放大器的
  • 三子棋创作(c语言)

    我们写三子棋之前首先要思考一下三子棋的实现逻辑 一 1 游戏菜单 是选择开始游戏还是结束游戏 2 打印一个棋盘出来 并且进行棋盘的初始化 即没有旗子的棋盘 3 玩家下棋 用 表示 4 电脑下棋 用 表示 5 判断胜负 电脑和玩家下完棋之后
  • java使用lambda表达式对List集合进行操作(Java8)

    import java util ArrayList import java util List import java util function Predicate import java util stream Collectors
  • token会被截取吗_OAuth2 为什么要用 code 换 token

    先简单介绍下 OAuth2 再用一个例子说明下为什么要用 code 换 token OAuth2 简单介绍 4 个角色 resource owner 可以授权访问被保护资源的实体 如果是人的话 即是最终用户 resource server
  • h2数据库优缺点

    h2数据库是嵌入式的内存型数据库 也可以存储在磁盘上 效率比通过socket调用的redis执行的要快 纯java编写就一个jar h2数据库的缺点是不适合大数据量高并发的操作
  • centos 安装防火墙,并开启对应端口号

    1 查看防火墙状态 命令 systemctl status firewalld service 开启防火墙时 提示没有安装防火墙 root localhost systemctl start firewalld service Failed
  • 关于锁的面试题

    1 synchronized和ReentranctLock有什么区别 底层实现 synchronized是jvm层面的锁 通过monitor对象完成 对象只能在同步代码块和同步方法中调用wait notify方法 ReentranctLoc