面试小札:闪电五连鞭_7

1. 为什么非公平锁的吞吐量大于公平锁?

    公平锁:公平锁的获取遵循先来先服务的原则。线程在获取锁时,如果锁被其他线程占用,它会进入队列等待,当锁可用时,队列中的第一个线程会获取到锁。这种机制保证了每个线程按照请求锁的顺序依次获得锁,但是频繁的队列操作(如入队、出队)会带来一定的性能开销。

    非公平锁:非公平锁在获取锁时,不会考虑线程的等待顺序。当锁释放时,新请求锁的线程有机会直接获取锁,而不是先检查等待队列。这样减少了线程切换和队列操作的开销。因为它允许插队行为,在高并发场景下,线程有更多机会直接获取锁并执行任务,从而减少了等待时间,提高了整体的吞吐量。

2. synchronized的原理是什么?

    在Java中,synchronized是一种内置的锁机制。它可以修饰方法或者代码块。

    当修饰方法时,字节码层面会有一个ACC_SYNCHRONIZED标志位。当方法被调用时,执行线程会检查方法的ACC_SYNCHRONIZED访问标志是否被设置。如果设置了,执行线程会先获取锁,然后执行方法体,方法执行完后再释放锁。

    当修饰代码块时,通过monitorenter和monitorexit指令实现。monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置和异常处理的位置。线程执行到monitorenter指令时,会尝试获取对象的监视器(monitor)锁。如果获取成功,就可以执行同步代码块,执行完后通过monitorexit指令释放锁。每个对象都有一个与之关联的监视器,它就像一个特殊的区域,同一时刻只能有一个线程持有该对象的监视器锁。

3. ReentrantLock的原理是什么?

    ReentrantLock是一个可重入的互斥锁。它实现了Lock接口。

    内部通过一个抽象的同步器(AbstractQueuedSynchronizer,AQS)来实现。AQS维护了一个等待队列,当线程尝试获取锁时,如果锁已经被其他线程持有,该线程会被包装成一个节点加入到等待队列中。

    它使用state变量来表示锁的状态,state为0表示锁未被占用,大于0表示锁被占用,并且记录了重入的次数。当一个线程获取锁时,通过CAS(Compare - And - Swap)操作尝试将state从0变为1,如果成功,就获取到了锁。如果是已经获取到锁的线程再次获取锁,state会递增,表示重入。

    当线程释放锁时,会通过CAS操作将state递减,当state变为0时,锁才真正被释放,并且会唤醒等待队列中的一个线程。

4. 什么是分段锁?

    分段锁是一种用于提高并发性能的锁机制。主要应用在如ConcurrentHashMap等数据结构中。

    它将数据结构分成多个段(segment),每个段都有自己独立的锁。例如,在ConcurrentHashMap中,它内部默认将数据分成16个段。

    当多个线程对不同段的数据进行操作时,它们可以并发地进行,因为不同段的锁是相互独立的。这样可以大大提高在高并发场景下对数据结构的操作效率,相比于对整个数据结构使用一个锁,分段锁能够在保证线程安全的同时,允许更高程度的并发访问。

5. 在什么时候应该使用可重入锁?

    当需要手动控制锁的获取和释放时,ReentrantLock(可重入锁)是一个很好的选择。例如,在复杂的业务逻辑中,需要在方法的不同部分灵活地获取和释放锁。

    当需要实现公平锁或非公平锁的特性时,ReentrantLock可以通过构造函数来指定是公平锁还是非公平锁。如果业务场景对锁的获取顺序有要求,比如需要按照请求的先后顺序来获取锁,就可以使用公平锁模式的ReentrantLock。

    在需要进行一些高级功能如尝试获取锁(tryLock)、可中断地获取锁(lockInterruptibly)的场景下。例如,在一个线程可能需要等待一定时间获取锁,如果超时则放弃等待,或者线程在等待锁的过程中可以被中断的情况下,ReentrantLock的这些功能就很有用。

6. synchronized和volatile的区别是什么?

语义方面:

    synchronized用于保证在同一时刻只有一个线程可以访问被它修饰的方法或者代码块,实现了互斥访问,从而保证了原子性、可见性和有序性。

    volatile主要用于保证变量的可见性和禁止指令重排序。它确保一个线程对共享变量的修改能及时被其他线程看到,但不能保证原子性。

应用场景方面:

    synchronized适用于多个线程访问共享资源,并且需要对共享资源进行复杂的操作,如读写操作都包含的情况。

    volatile适用于多个线程共享一个变量,并且这个变量的修改操作比较简单,如只有一个线程进行写操作,其他线程进行读操作的场景。

性能方面:

    在简单的变量共享场景下,volatile的性能通常比synchronized要好,因为它没有像synchronized那样涉及到锁的获取和释放等复杂操作。但是在复杂的并发场景下,synchronized提供的完整的同步机制可能是更合适的选择。

7. 多线程synchronized锁升级的原理是什么?

    在Java中,synchronized锁有偏向锁、轻量级锁和重量级锁三种状态,会根据不同的竞争情况进行升级。

    偏向锁:偏向锁的目的是在大多数情况下,锁总是由同一线程多次获取。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储偏向的线程ID。以后该线程进入和退出同步块时,不需要进行CAS操作来加锁和解锁,只需要简单地测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。偏向锁的获取和释放几乎没有性能开销。

    轻量级锁:当有另外一个线程尝试竞争偏向锁时,偏向锁会升级为轻量级锁。轻量级锁通过CAS操作在对象头和栈帧中的锁记录之间交换数据来实现加锁。如果CAS操作成功,线程就获取到了轻量级锁。轻量级锁适用于线程交替执行同步块的情况,它的开销比重量级锁小,因为它避免了进入操作系统的内核态来实现互斥。

    重量级锁:当多个线程竞争轻量级锁,且自旋一定次数后仍然无法获取锁时,轻量级锁会升级为重量级锁。此时,线程会通过操作系统的互斥量(mutex)来实现互斥,这涉及到线程阻塞和唤醒等操作,会有比较大的性能开销。重量级锁主要用于高竞争的场景,保证线程安全。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3大Excel免费功能

推荐几个免费excel图表绘制工具 Power Map Power Map是Excel的内置功能 Power Map可在Windows用户的Excel 2013或者Excel 2016或者Office 365中使用,如下图, 看案例 动态地图1 动态地图2

前端面试问题集合

0 HTML5相关 websocket WebSocket 使用ws或wss协议,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或X…

强化学习路径规划:基于SARSA算法的移动机器人路径规划,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码

一、SARSA算法概述 SARSA(State-Action-Reward-State-Action)是一种在线强化学习算法,用于解决决策问题,特别是在部分可观测的马尔可夫决策过程(POMDPs)中。SARSA算法的核心思想是通过与环境的交互来学习一…

通过基于几何的网格自适应增强 CFD 网格划分

CFD 仿真中的网格质量问题 在 CFD 仿真中,网格质量直接影响分析精度和效率。结构良好的网格可以准确地捕捉物理现象,确保可靠的结果,而质量差会导致错误和代价高昂的设计缺陷。高质量的网格在复杂的几何体中至关重要,因为流体行为…

Dockerfile文件编写

目录 Dockerfile文件编写 1.什么是Dockerfile 2. Dockerfile作用 3.dockerfile 的基本结构: 4.dockerfile指令: FROM 指定基础镜像,dockerfile构建镜像的第一个指令 LABEL 指定镜像维护人信息 ADD/COPY 复制本地文件/目录到镜像中 …

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…

pytest -s执行的路径

pytest -s执行的路径: 直接写pytest -s,表示从当前路径下开始执行全部.py的文件。 执行具体指定文件:pytest -s .\testXdist\test_dandu.py 下面这样执行pytest -s 会报找不到文件或没权限访问, 必须要加上具体文件路径pytest -s…

XXE练习

pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…

Numpy基本介绍

目录 1、Numpy的优势 1.1、ndarray介绍 1.2、ndarray与Python原生list运算效率对比 1.3、ndarray的优势 1.3.1、内存块风格 1.3.2、ndarray支持并行化运算(向量化运算) 1.3.3、效率远高于纯Python代码 2、N维数组-ndarray 2.1、ndarray的属性 2.2、ndarray的形状 2…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

makefile文件

简介&#xff1a; 自动化编译&#xff1a;只需要一个make命令&#xff0c;整个工程自动编译 提高编译效率&#xff1a;再次编译时&#xff0c;只编译修改的文件&#xff08;查看时间戳&#xff0c;根据修改文件的时间判断文件是否被修改&#xff09; 基本语法&#xff1a; …

ArKTS基础组件

一.AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件。 子组件 color:设置文字颜色。 参数名类型必填说明valueResourceColor是 文字颜色。 默认值&#xff1a;0x99182431。 selectedColor:设置选中项文字颜色。 参数名类型必填说明valueRes…

微积分复习笔记 Calculus Volume 2 - 4.3 Separable Equations

4.3 Separable Equations - Calculus Volume 2 | OpenStax

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…

LM芯片学习

1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…

OCR多模态大模型:视觉模型与LLM的结合之路

原文&#xff1a;https://zhuanlan.zhihu.com/p/7783443583 在使用多模态大模型(Visual Language Model, VLM)做视觉信息抽取时&#xff0c;常常出现错字的问题。为了解决这一问题&#xff0c;本文提出了一种名为Guidance OCR的方法。该方法在不额外训练模型的情况下&#xff…

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

飞牛 fnos 上用docker部署一款网页端办公系统

描述 一款高效的内网办公操作系统&#xff0c;内含word/excel/ppt/pdf/内网聊天/白板/思维导图等多个办公系统工具&#xff0c;支持原生文件存储。平台界面精仿windows风格&#xff0c;操作简便&#xff0c;同时保持低资源消耗和高性能运行。无需注册即可自动连接内网用户&…

【网络安全】网站常见安全漏洞—服务端漏洞介绍

文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞&#xff1f;如何防范&#xff1f; 2. SQL 注入什么是SQL注入&#xff1f;如何防范&#xff1f; 3. 命令执行漏洞什么是命令执行漏洞&#xff1f;如何防范&#xff1f; 4. 越权漏洞什么是越…