当前位置: 首页 > news >正文

从0开始理解并发、线程与等待通知机制(下)

线程安全问题与synchronized机制

  • 线程安全问题演示

    • 示例类SynTest定义一个count变量。
    • 启动两个线程对count进行累加操作,预期结果为2万。
    • 实际运行结果小于2万且不稳定,表明线程不安全。
  • 原因分析

    • 多线程同时访问共享变量导致不可预料的结果。
    • 解决方案:使用synchronized关键字加锁。
  • synchronized使用方式

    • 方法级别加锁
      • 在方法返回值前添加synchronized关键字。
      • 该锁对象为当前实例(this)。
    • 代码块加锁
      • 使用synchronized(this)synchronized(obj)指定锁对象。
      • 更灵活,适用于部分代码加锁场景。
  • 对象锁与类锁的区别

    • 对象锁:用于成员方法或同步块中,锁对象为具体实例(如this或任意Object)。
    • 类锁:用于静态方法或锁住类的class对象。
    • 关键原则:多个线程必须持有同一把锁才能实现互斥访问共享资源。
  • 错误使用synchronized案例

    • 若两个线程分别使用不同的锁对象(如new Object()),则无法保证线程安全。
    • 必须确保多个线程使用的锁对象是同一个。

volatile关键字详解

  • 应用场景

    • 适用于一写多读的并发场景。
    • 例如主线程修改某个标志位,其他线程感知变化并作出响应。
  • 作用与限制

    • 可见性:一个线程对变量的修改对其他线程立即可见。
    • 有序性:防止指令重排序优化。
    • 不能保证原子性:无法替代synchronizedAtomicInteger等原子类。
  • 为何不是锁机制?

    • volatile仅提供轻量级通信与同步机制,无加锁过程。
    • 不具备互斥能力,不能解决多线程同时写共享变量的安全问题。
  • 字节码层面解释

    • 对于Integer count变量,每次count++都会创建新的Integer对象。
    • 导致即使加锁,也可能因锁对象变化而失效。
    • 可通过打印哈希码验证对象地址是否变化。
  • volatile vs synchronized

    • synchronized既能保证可见性,又能保证原子性和有序性。
    • volatile只能保证可见性和有序性。

等待通知机制标准范式

  • 生活类比:快递通知机制

    • 类似快递到达驿站后系统发短信通知用户取件。
    • 避免轮询浪费资源。
  • 核心API:Object类中的wait与notify

    • wait():使线程进入等待状态,释放锁。
    • notify()/notifyAll():唤醒一个或所有等待线程。
    • 必须在synchronized块中调用,否则抛出异常。
  • 标准范式

    • 等待方:

      java

      synchronized(锁对象) { while (条件不满足) { 锁对象.wait(); } // 条件满足,继续执行业务逻辑 }
    • 通知方:

      java

      synchronized(锁对象) { // 修改条件 锁对象.notifyAll(); }
  • 注意事项

    • wait()会释放锁,notify()不会立即释放锁,需等到同步块执行完毕。
    • 必须在while循环中检查条件,避免虚假唤醒。

实战案例:模拟快递运输与连接池

  • 快递运输案例

    • 主线程模拟快递运输,每增加100公里唤醒一次。
    • 子线程监听公里数变化,更新数据库;另一子线程监听是否到达目的地并通知用户。
  • 连接池实现

    • 使用等待通知机制管理数据库连接池。
    • 支持超时等待模式,增强灵活性。
    • 核心思想:空闲时等待,有连接可用时通知唤醒。
  • 等待超时模式实现

    • 记录超时时间戳。
    • 每次被唤醒后重新计算剩余等待时间。
    • 时间归零则退出等待,抛出异常。

面试高频题解析

  • 线程相关方法与锁的关系

    • sleep():不释放锁。
    • yield():不释放锁。
    • wait():释放锁。
    • notify()/notifyAll():不释放锁,同步块执行完才释放。
  • 为什么wait/notify必须在同步块中调用?

    • 避免lost wake-up问题。
    • 若不在同步块中调用,可能导致通知丢失,线程永远阻塞。
  • 为什么要在while中检查条件?

    • 多线程环境下可能出现虚假唤醒
    • 使用while循环确保条件真正满足后再继续执行。

补充知识:CompletableFuture

  • 背景

    • JDK1.8引入,用于简化Future任务编排。
    • 支持链式调用、组合任务、异步处理等。
  • 核心功能

    • 任务编排:支持任务之间的依赖关系(thenApply, thenAccept等)。
    • 异步执行:支持自定义线程池。
    • 组合任务:allOf, anyOf等。
  • 接口结构

    • CompletableFuture<T>实现了Future<T>CompletionStage<T>接口。
    • 提供丰富API用于任务控制和组合。

答疑总结

  • 关于notify与notifyAll

    • notify()随机唤醒一个等待线程。
    • notifyAll()唤醒所有等待线程。
    • 实际开发中更推荐使用notifyAll(),避免遗漏唤醒目标线程。
  • CompletableFuture是否能替代线程池?

    • 不能完全替代,它只是任务编排工具。
    • 仍需线程池执行实际任务。
  • 同步机制的本质

    • 同步即协调多个线程按顺序访问共享资源。
    • synchronizedvolatile均可实现同步,但侧重点不同。
  • volatile如何保证可见性?

    • 插入内存屏障,刷新CPU缓存到主存。
    • 所有读线程均可看到最新值。
  • 类锁能否继承?

    • 不可以,锁是基于对象或class对象,不具有继承特性。
http://www.jsqmd.com/news/526450/

相关文章:

  • 2026年,IT裁员潮来势凶猛,AI正在吞噬开发岗位,学会大模型才是生存之道,建议收藏
  • 别再踩坑了!手把手教你用VMware Workstation 17搭建FusionCompute 6.5.1实验环境(CNA+VRM保姆级教程)
  • RMBG-2.0直播场景应用:OBS虚拟摄像头直连,实时抠像+绿幕替换低延迟方案
  • 从零开始:用ResNet18镜像实现图片内容自动分类
  • Lab: Xv6 and Unix utilities
  • Chrome WebRTC调试实战:从信令到媒体流的全链路问题排查指南
  • LT9211芯片实战:从单路LVDS到双路LVDS的高效转换方案
  • OpenClaw+Qwen3-VL:30B:打造个人多模态AI助手全流程
  • HTML常用CSS样式推荐:打造高效、美观的网页设计
  • SD-MTSP:利用KOA算法优化单仓库多旅行商问题的MATLAB实现,可灵活调整数据集与参数
  • GLM-4-9B-Chat-1M多机部署方案:分布式推理集群搭建
  • 从PSDK到ROS节点:GPS数据订阅与发布的实战封装
  • 文墨共鸣作品集:StructBERT模型下的中文语义分析之美
  • 浦语灵笔2.5-7B实战教程:bash脚本定制化启动与日志调试方法
  • 集简云、简道云、宜搭低代码平台实战选型指南:从功能到场景的深度解析
  • QT桌面应用集成Z-Image-Turbo:开发本地化AI绘画工具
  • Pixel Dimension Fissioner 在VMware虚拟机中的部署与性能测试
  • 2025-2026年铝单板厂家推荐:异形曲面定制设计专业厂家及用户反馈汇总 - 品牌推荐
  • RMBG-2.0创意应用:为LoRA训练准备高质量透明主体数据集方法
  • 2026知识产权转让优质服务机构推荐指南:软件著作知识产权/雏鹰企业项目申报公司/高新技术项目申报/专利申请知识产权/选择指南 - 优质品牌商家
  • 2026年羽绒服品牌推荐:户外探索与都市通勤兼顾靠谱选择及选购指南 - 品牌推荐
  • TTL门电路入门:从硅管到锗管,手把手教你理解三极管逻辑
  • 从渗透测试角度看LOIC和HOIC:合法使用场景与配置技巧
  • 第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据
  • 学习日记DAY10
  • 2026年无刷电机厂家推荐:工业自动化高精度需求靠谱品牌与用户口碑分析 - 品牌推荐
  • ESP32S3开发板实战:5分钟搞定USB摄像头Wi-Fi图传(含OV2640配置指南)
  • Pixel Mind Decoder 企业级部署架构设计:高可用与负载均衡实践
  • 如何通过服务优化提升Windows 10系统响应速度?完整技术指南
  • 2026年靠谱的包装机工厂推荐:四川包装机销售厂家推荐 - 品牌宣传支持者