Synchronized是非公平锁吗?那么如何体现?锁能降级吗?

news/2024/10/22 10:47:37/

1. synchronized 是非公平锁吗?

是的,synchronized 是非公平锁。

什么是非公平锁?

非公平锁意味着线程获取锁的顺序并不一定按照先后到达的顺序,也就是说,后来的线程有可能插队,优先获取锁。这种机制可以减少线程切换的开销,提高系统的吞吐量。

如何体现 synchronized 的非公平性?

sychronized 的非公平性体现在JVM 的内部实现上。当多个线程竞争锁时,synchronized 并不会按照线程请求锁的顺序来安排锁的获取,而是让竞争最激烈的线程尽快获取锁。这种设计有助于避免某些线程长期得不到锁的情况,也能加快线程获取锁的速度。

2. 锁能降级吗?

synchronized 机制下,锁不能降级。

什么是锁降级?

锁降级是指将持有的高等级锁(如写锁)降级为低等级锁(如读锁)的过程。常见于可重入锁(如 ReentrantReadWriteLock)中,降级可以通过以下过程实现:

  1. 持有写锁时,如果希望多个线程进行只读访问,先获取读锁再释放写锁。
  2. 降级允许系统在保持一定并发性能的同时,提供必要的线程安全性。

但在 synchronized 机制中,锁的持有要么是独占锁(写锁),要么没有持有,不支持类似读写锁的降级行为。

3. synchronized 的实现机制

synchronized 是 JVM 内置的锁机制,基于对象头MarkWord 字段,通过偏向锁、轻量级锁和重量级锁来实现对锁的优化。

  • 偏向锁:当只有一个线程竞争时,线程偏向锁住对象,几乎无性能损耗。
  • 轻量级锁:当多个线程开始竞争时,会升级为轻量级锁,通过自旋等待的方式减少上下文切换。
  • 重量级锁:当自旋等待的时间过长或线程数量增多时,锁升级为重量级锁,涉及线程阻塞和唤醒机制,性能相对较差。

synchronized 中,锁升级是可以的(从偏向锁到重量级锁),但锁降级是不可用的。

4. 锁的非公平性和实现的设计考量

非公平锁在高并发情况下可以提升系统的吞吐量。synchronized 采用非公平锁的原因是:

  1. 避免线程饥饿:如果采用公平锁,会导致后续线程等待锁的时间较长,增加了线程切换的成本。
  2. 提高吞吐量:非公平锁允许后来的线程有机会获取锁,减少了线程排队等待的时间,提高了锁的获取速度和系统的整体效率。

5. 如何检测 synchronized 的非公平性

可以通过设计一个多线程竞争锁的场景来观察:

java">public class SynchronizedFairnessTest {private static int counter = 0;public synchronized static void increment() {counter++;System.out.println(Thread.currentThread().getName() + " incremented counter to: " + counter);}public static void main(String[] args) {Runnable task = () -> {for (int i = 0; i < 5; i++) {increment();try {Thread.sleep(50); // 模拟其他操作} catch (InterruptedException e) {e.printStackTrace();}}};// 创建多个线程,模拟并发Thread t1 = new Thread(task, "Thread 1");Thread t2 = new Thread(task, "Thread 2");Thread t3 = new Thread(task, "Thread 3");t1.start();t2.start();t3.start();}
}

在多线程的环境下,Thread 1Thread 2Thread 3 的执行顺序是非确定性的,因为 synchronized 不保证公平性。

6. 业务场景和问题解决

在高并发业务场景下,比如订单处理系统中多个线程同时处理订单生成操作时,synchronized 非公平锁可以提高吞吐量,让高并发的请求迅速得到处理。但在某些对顺序要求严格的场景下(如日志系统、数据审计),这种非公平性可能会带来问题。因此,在需要严格控制线程获取锁顺序的场景中,可以考虑使用 ReentrantLock 并设置其为公平锁。


http://www.ppmy.cn/news/1541043.html

相关文章

python的Django框架入门

Django是一个开源的Python Web开发框架&#xff0c;遵循MTV&#xff08;Model-Template-View&#xff0c;模型-模板-视图&#xff09;架构&#xff0c;是一个全功能的Web框架&#xff0c;Django的模块化设计允许开发者通过添加自定义插件、使用第三方库等方式来增强其功能。 一…

后端接收参数的几种常用注解

目录 一、RequestParam 二、RequestBody 三、PathVariable 四、RequestHeader 五、RequestAttribute 六、RequestPart 七、Valid 一、RequestParam 1.作用 用于将请求中的 查询参数 或 表单参数 绑定到方法的参数上。支持 GET 和 POST 请求。 2.使用方法 GetMappin…

第十四届单片机嵌入式蓝桥杯

一、CubeMx配置 &#xff08;1&#xff09;LED配置 &#xff08;1&#xff09;LED灯里面用到了SN74HC573ADWR锁存器&#xff0c;这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚&#xff08;使能引脚&#xff09;&#xff0c;由PD2这个端口来控制的 &#xff08;2&#xff…

多模态技术的协同表现:从文本生成、语音合成到口型同步综合测评

本文是针对多模态对话系统核心技术栈的使用效果和网络测评整理。 测评内容基于用户体验&#xff0c;侧重于从使用者角度出发&#xff0c;讨论实际操作中的体验感受&#xff0c;如技术的易用性、输出效果如文本的连贯性、语音的自然度、口型同步的准确性等。不涉及具体算法架构…

[C#][winform]基于yolov5的驾驶员抽烟打电话安全带检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

【ubuntu18.04】ubuntu18.04安装vmware-tools之后立即适应窗口为灰色,窗口不会自适应

问题描述 ubuntu18.04安装vmware-tools 点击查看&#xff0c;看到立即适应窗口为灰色 解决方案 关闭虚拟机 编辑此虚拟机 设置 注意 取消勾选拉伸模式 查看可以看到所有选项可选择 注意&#xff1a; 不要全屏的时候查看&#xff0c;全屏看到的立即适应窗口就会显示…

Android15使用Winscope

使用 Winscope 跟踪窗口转换 | Android Open Source Project (google.cn) Winscope 是一款 Web 工具&#xff0c;可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文件的 Winscope…

数据分析-31-时间序列分析的卡尔曼滤波器平滑方法

1 卡尔曼滤波器估计系统状态 Kalman Filter(卡尔曼滤波器)算法是一种线性最小方差估计器,用于在存在噪声的情况下对随机过程或系统进行估计。它的基本思想是通过一系列的迭代步骤,不断优化对系统状态的估计。算法主要包含两个步骤:预测和更新。 1.1 卡尔曼滤波器的原理 …