文章目录

      • 一、线程同步的核心目标
      • 二、线程安全的判定条件
      • 三、同步方式一:synchronized 关键字
        • 1. 同步代码块
        • 2. 同步方法
      • 四、锁的释放与不释放场景
        • 1. 自动释放锁的场景
        • 2. 不会释放锁的场景
      • 五、同步方式二:ReentrantLock(显式锁)
        • 1. 核心特性
        • 2. 使用规范
      • 六、synchronized 与 ReentrantLock 的对比
      • 总结

以下是对线程同步相关知识点的系统整理,涵盖同步方式、锁机制、线程安全条件及释放规则等核心内容:

一、线程同步的核心目标

解决多线程并发操作共享资源时的线程安全问题(如数据不一致、重复修改等),通过控制线程对共享资源的访问顺序,保证操作的原子性、可见性和有序性。

二、线程安全的判定条件

出现线程安全问题必须同时满足两个条件:

  1. 多线程环境:程序运行在多个线程并发执行的场景中。
  2. 共享资源:多个线程操作的是同一份资源(如共享变量、对象属性等)。

解决方案:通过“锁机制”保证同一时间只有一个线程能操作共享资源,核心是所有线程必须使用同一把锁

三、同步方式一:synchronized 关键字

synchronized 是 Java 内置的隐式锁机制,通过“监视器(Monitor)”实现,可修饰代码块或方法。

1. 同步代码块
  • 语法

    synchronized (锁对象) {// 需要同步的代码(操作共享资源的逻辑)
    }
    
  • 核心要素

    • 锁对象:可以是任意对象(通常使用共享资源本身或 this),但必须保证所有线程使用同一把锁
    • 同步范围:仅包含操作共享资源的代码,范围越小,效率越高。
  • 示例

    // 共享资源
    private int count = 0;
    private Object lock = new Object(); // 锁对象// 多线程执行的方法
    public void increment() {synchronized (lock) { // 所有线程使用同一把lock锁count++; // 操作共享资源}
    }
    
2. 同步方法
  • 语法:直接在方法声明处添加 synchronized 关键字,隐式指定锁对象。

    // 实例方法
    public synchronized void method1() { ... }// 静态方法
    public static synchronized void method2() { ... }
    
  • 隐式锁对象规则

    • 实例方法:锁对象为 this(当前对象实例)。
    • 静态方法:锁对象为 类名.class(当前类的字节码对象,全局唯一)。
  • 特点

    • 无需显式指定锁对象,简化代码,但同步范围是整个方法(可能降低效率)。
    • 静态同步方法和实例同步方法使用的是不同锁(类对象 vs 实例对象),两者不会互斥。

四、锁的释放与不释放场景

synchronized 锁的释放由 JVM 自动管理,以下情况会触发释放或不释放:

1. 自动释放锁的场景
  • 同步代码块或同步方法正常执行完毕(执行到代码块末尾)。
  • 同步代码中出现未捕获的异常或错误,导致线程终止。
  • 同步代码中调用 wait() 方法(线程进入等待状态,主动释放锁)。
  • 同步代码中通过 breakreturn 等语句退出代码块/方法。
2. 不会释放锁的场景
  • 调用 Thread.sleep(long):线程休眠时仍持有锁(其他线程无法获取)。
  • 调用 Thread.yield():线程主动让出 CPU,但锁未释放。
  • 线程被 suspend() 暂停(已过时方法):暂停期间仍持有锁,可能导致死锁。

五、同步方式二:ReentrantLock(显式锁)

java.util.concurrent.locks.ReentrantLock 是 JDK 提供的显式锁实现,比 synchronized 更灵活。

1. 核心特性
  • 可重入性:同一线程可多次获取同一把锁(与 synchronized 一致)。
  • 公平性:通过构造函数指定是否为公平锁:
    ReentrantLock fairLock = new ReentrantLock(true); // 公平锁(按请求顺序获取锁)
    ReentrantLock nonfairLock = new ReentrantLock(false); // 非公平锁(默认,可能插队)
    
    • 公平锁:线程按请求锁的顺序获取锁,避免饥饿,但效率较低。
    • 非公平锁:允许线程“插队”获取锁,效率更高,但可能导致部分线程长期等待。
2. 使用规范

必须手动获取锁和释放锁,且释放操作需放在 finally 中,确保锁一定被释放:

ReentrantLock lock = new ReentrantLock();public void operation() {lock.lock(); // 手动获取锁try {// 操作共享资源(可能出现线程安全的代码)} finally {lock.unlock(); // 手动释放锁,必须在finally中}
}

六、synchronized 与 ReentrantLock 的对比

特性synchronizedReentrantLock
锁类型隐式锁(JVM 自动管理)显式锁(手动获取和释放)
公平性仅支持非公平锁可通过构造函数指定公平/非公平
可中断性不可中断支持中断(lockInterruptibly()
条件变量仅支持 wait()/notify()支持多个 Condition 对象,更灵活
性能JDK 1.6 后优化,与 ReentrantLock 接近高并发下略优,功能更丰富

总结

  1. 线程同步的核心是通过锁机制控制共享资源的并发访问,需保证多线程使用同一把锁。
  2. synchronized 适合简单场景,隐式管理锁的获取和释放,易用性高。
  3. ReentrantLock 适合复杂场景(如公平性控制、中断处理),需手动管理锁,灵活性更高。
  4. 无论使用哪种锁,都需注意锁的释放时机,避免死锁(如 sleep() 不释放锁可能导致的问题)。

合理选择同步方式是保证多线程程序正确性和效率的关键。

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

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

相关文章

Armoury Crate无法通过BIOS卸载

设备:天选4 Armoury Crate窗口反复弹出影响使用体验,但无法通过BIOS关闭该怎么办?本文以天选4为例提供解决方案。 Step1:进入服务支持官网 Armoury Crate-服务支持 下滑点击”查看更多” 下载安装卸载工具 得到Armoury_Crate_Un…

如何将视频转为GIF格式,3大视频转为GIF工具

在社交媒体和即时通讯盛行的当下,GIF 动图以其独特的魅力备受青睐。它能够生动地捕捉视频中的精彩瞬间,凭借体积小巧、无需复杂加载且可循环播放的特性,成为了人们在网络交流中表达情感、分享趣事的得力工具。无论是制作诙谐幽默的表情包&…

开发避坑指南(22):Vue3响应式编程中this绑定机制与解决方案

错误信息 TypeError: Cannot read properties of undefined (reading find) TypeError: r.vnode.el.querySelector is not a function报错背景 vue2项目升级到vue3后,原来的代码报错。 报错代码computed: {/** 计算列的显示与隐藏*/columnVisible() {return functio…

AI学习笔记三十五:实时传输视频

若该文为原创文章,转载请注明原文出处。 目的是实现视频的传输,只是个demo. 程序分为两部分,视频接收端和视频发送端。 一、视频接收端流程分析 主要流程: 初始化配置: 设置UDP端口(5001)和缓…

【ArcGIS】分区统计中出现Null值且Nodata无法忽略的问题以及shp擦除(erase)的使用——以NDVI去水体为例

需求 已有某地NDVI栅格、行政区shp以及水体shp,计算每个行政区的平均NDVI 问题 1.如果不剔除水体 负值NDVI会把平均值拉低 且水体NDVI并不全为负 需要通过shp剔除,Mask掩膜是提取水体本身而不是剩余部分 2.使用分区统计工具(Zonal statis…

Linux中的内核同步源码相关总结

什么是内核同步Linux 内核同步是指内核中用于解决并发执行单元(如进程、中断、内核线程等)对共享资源(如全局数据结构、硬件寄存器、链表等)的竞争访问的一系列机制和技术。其核心目标是保证多个并发单元在操作共享资源时的数据一…

WORD接受修订,并修改修订后文字的颜色

在 Word 中,接受修订之后默认会采用正文的默认字体格式,不会保留修订时设置的颜色,比如“插入内容是蓝色字体”的设置会被清除。 如果你想要做到:✅ 接受所有修订后仍然让“原插入的文字”变为蓝色字体保留下来你只能通过一些手动…

行业速览:中国新能源汽车市场格局与关键趋势

在全球汽车产业迈向绿色、低碳、智能化的变革浪潮中,新能源汽车已成为各国争夺的战略高地。中国,作为全球最大的汽车市场和新能源汽车制造国,正以强大的市场规模、完整的产业链体系以及快速提升的技术创新能力,在这场变革中不断加…

【51单片机2个按键控制流水灯转向】2022-10-25

缘由51单片机按键流水灯-嵌入式-CSDN问答 #include "REG52.h" sbit k1P3^0; sbit k2P3^1; void main() {unsigned char l0,xd0,ys10,ys20,z0;P1l;while(1){if(k10&&xd0){z0;while(k10);}if(k20&&xd0){z1;while(k20);}if(ys10)if(ys20){if(z0)if(l0)…

flutter开发(一)flutter命令行工具

安装 Linux下面的flutter安装比较简单,在flutter 中文战 上下载一个最新稳定的版本,解压到系统上就行了。 我下载的是Linux下的3.32.7版。 解压之后,flutter目录里会有bin、dev等目录,把bin目录加到系统的PATH环境变量里&#…

OpenCV 入门实战:从环境配置到图像 / 视频处理

OpenCV 是计算机视觉领域最常用的开源库之一,它提供了丰富的图像和视频处理功能。本文将从环境配置开始,带大家一步步解析基础操作代码,快速入门 OpenCV 的使用。 一、环境配置 在开始之前,我们需要先搭建好 OpenCV 的运行环境。…

2.2.1 饰面板材和陶瓷的特性和应用

1、饰面石材1)天然花岗岩2)天然大理石3)人造石(1)人造石按主要原材料分包括人造石实体面材、人造石英石和人造石岗石等产品。2、建筑卫生陶瓷建筑卫生陶瓷包括建筑陶瓷和卫生陶瓷两大类。建筑陶瓷包括陶瓷砖、建筑琉璃…

C++的结构体数组

结构体数组的基础知识 结构体数组通过​​组合数据批量管理​​的特性,广泛应用于学生管理、游戏角色属性存储等场景。常见问题 ​​数组越界​​:静态数组长度固定,超过数组长度的访问,会导致未定义行为。​​未初始化成员​​&a…

小程序中使用echarts(2025/8/8)

这篇博文讲的很详细,也很简洁,这里补充一点东西 小程序中使用echarts(硬货,全网最详细教程!)_小程序使用echarts-CSDN博客 简单来说就是去官网下载ec-canvas组件,将其中的echarts.js换成echarts.min.js(原…

【SpringBoot】SpringBoot配置

根据自动配置原理 学习后,整理学习笔记 一定要耐心去看,耐着性子去学习,慢慢慢慢就明白了 配置深化学习 前提 通过 SpringBootApplication 找到 EnableAutoConfiguration;发现 Import({AutoConfigurationImportSelector.class})…

网络安全与软件定义汽车的发展

在许多汽车公司,同一个系统工程团队同时负责安全(safety)和安防(security)。因此,网络安全被视为安全(safety)的一个子集,其根源在于一个隐含的假设:“如果安…

字典列表依据数值键排序

要根据字典列表中的特定数值键进行排序,我们可以使用 Python 的 sorted() 函数配合自定义排序键。以下是操作方法: 1. 按升序排序(从小到大) sorted_list sorted(original_list, keylambda x: x[数值键名])2. 按降序排序&#xf…

五、SpringBoot工程打包与运行

SpringBoot工程打包与运行 1、SpringBoot项目快速启动(Windows版) (1)对SpringBoot项目打包(执行Maven构建指令package): mvn package (2)运行项目(执行启动指令) java -jar springboot.jar 2、…

构建高可用架构:ZDNS GSLB 在多数据中心场景下的应用与 F5 替换实践

随着互联网的快速发展,金融机构、大型企业等组织单位,出于自身业务发展的需要和国家监管的要求,纷纷通过建设多数据中心来提升不同地区的用户体验,同时避免不可抗力因素带来的巨大损失。ZDNS GSLB 全局负载均衡技术,能…

【JMeter】压测脚本生成完善增强

JMeter 压测脚本生成完善增强0. 通过JMeter代理服务器录制脚本1. 设置客户端的代理2. JMeter GUI配置 以及录制脚本3. 调试脚本附录0. 通过JMeter代理服务器录制脚本 1. 设置客户端的代理 JMeter代理服务器默认端口号就是8888 2. JMeter GUI配置 以及录制脚本 新建线程组 …