【多线程面试题二十一】、 分段锁是怎么实现的?

这篇具有很好参考价值的文章主要介绍了【多线程面试题二十一】、 分段锁是怎么实现的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

【多线程面试题二十一】、 分段锁是怎么实现的?,# 多线程面试题,java,开发语言

面试官: 分段锁是怎么实现的?

参考答案:

在并发程序中,串行操作是会降低可伸缩性,并且上下文切换也会减低性能。在锁上发生竞争时将通水导致这两种问题,使用独占锁时保护受限资源的时候,基本上是采用串行方式—-每次只能有一个线程能访问它。所以对于可伸缩性来说最大的威胁就是独占锁。

我们一般有三种方式降低锁的竞争程度:

  • 1、减少锁的持有时间;

  • 2、降低锁的请求频率;

  • 3、使用带有协调机制的独占锁,这些机制允许更高的并发性。

在某些情况下我们可以将锁分解技术进一步扩展为一组独立对象上的锁进行分解,这称为分段锁。其实说的简单一点就是:容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

如下图,ConcurrentHashMap使用Segment数据结构,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。所以说,ConcurrentHashMap在并发情况下,不仅保证了线程安全,而且提高了性能。

【多线程面试题二十一】、 分段锁是怎么实现的?,# 多线程面试题,java,开发语言文章来源地址https://www.toymoban.com/news/detail-741576.html

到了这里,关于【多线程面试题二十一】、 分段锁是怎么实现的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java多线程&并发篇----第二十一篇

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 ArrayB

    2024年01月18日
    浏览(59)
  • UE4/5C++多线程插件制作(二十一、使用)

    目录 DemoPawn.h DemoPawn.cpp 会出现的bug 插件 相关的插件制作在上一节已经完成了。 具体的使用方式在第0章已经写了,get之后去绑定即可。 而后笔者做了一个接口,具体的绑定方式也就在这个接口里面。 接下来最重要的是进行使用,对此我做了一个与蓝图相关的接口,里面是这

    2024年02月12日
    浏览(55)
  • python面试题二:数组(字符串)实现反转的方式

    a_list = [1, 4, 6, 2, 9, 4, 8, 3, 7] print(reversed(a_list)) aa_list = list(reversed(a_list)) print(a_list) print(aa_list) b_list = [1, 4, 6, 2, 9, 4, 8, 3, 7] b_list.reverse() print(b_list) c_list = [1, 4, 6, 2, 9, 4, 8, 3, 7] print(c_list[::-1]) 参考:风一样汉字–Python 实现字符串反转的9种方法

    2023年04月12日
    浏览(64)
  • 2023前端面试题二

    png 无损压缩,尺寸体积要比jpg的大,适合做小图标 jpg 采用压缩算法,有一点失真,比png体积要小,适合做中大图片 gif 一般是做动图的 webp 同时支持有损或者无损压缩,相同质量的图片,webp具有更小的体积 标准盒子模型 margin/border/padding/content ie盒子模型 margin/content(border+

    2024年02月02日
    浏览(40)
  • 前端(二十一)——WebSocket:实现实时双向数据传输的Web通信协议

    🤨博主:小猫娃来啦 🤨文章核心: WebSocket:实现实时双向数据传输的Web通信协议 在当今互联网时代,实时通信已成为很多应用的需求。为了满足这种需求,WebSocket协议被设计出来。WebSocket是一种基于TCP议的全双工通信协议,通过WebSocket,Web应用程序可以与服务器建立持久

    2024年02月04日
    浏览(64)
  • Android笔记(二十一):Room组件实现Android应用的持久化处理

    Room是Android JetPack架构组件之一,是一个持久处理的库。Room提供了在SQLite数据库上提供抽象层,使之实现数据访问。 (1)实体类(Entity):映射并封装了数据库对应的数据表中对应的结构化数据。实体定义了数据库中的数据表。实体类中的数据域与表的列一一对应。 (2)数

    2024年01月20日
    浏览(54)
  • OpenGL ES与EGL的关系(二十一),完美讲解内存缓存LruCache实现原理

    glEnable(GL_TEXTURE_2D); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); const GLint xc = (mWidth - mAndroid[0].w) / 2; const GLint yc = (mHeight - mAndroid[0].h) / 2; const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h); glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(), updateRect.height()); // Blend st

    2024年04月11日
    浏览(39)
  • linux c多个线程分段读取一个文件

    在 Linux C 中,你可以使用 pthread 库来创建多线程,并使用文件 I/O 来对文件进行读取和写入操作。以下是一个简单的示例代码,演示如何在 C 语言中开启 8 个线程同时读取一个文件并将其分成 8 段保存到 8 个临时文件中: 在上面的示例中,我们使用了 pthread 库来创建了 8 个线

    2024年02月01日
    浏览(40)
  • 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

      springboot篇章整体栏目:  【一】springboot整合swagger(超详细 【二】springboot整合swagger(自定义)(超详细) 【三】springboot整合token(超详细) 【四】springboot整合mybatis-plus(超详细)(上) 【五】springboot整合mybatis-plus(超详细)(下) 【六】springboot整合自定义全局异常

    2023年04月08日
    浏览(68)
  • 【python】多线程下载m3u8分段视频

    1.说明 m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一个完整视频。拼接的话很简单,像格式工厂等很多软件都可以

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包