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

Java并发编程-多线程基础(三)

文章目录

  • 线程间通信
    • 线程间通信的核心问题
    • volatile 关键字
      • 1. 核心特性
      • 2. 使用限制
      • 3. 示例
    • synchronized 关键字
      • 1. 核心特性
      • 2. 示例
    • volatile 与 synchronized 的对比
    • Volatile 和 Synchronized 最佳实践

线程间通信

线程间通信的核心问题

多个线程通过共享内存实现信息交换,但需解决以下问题:

  1. 可见性:线程修改变量后其他线程能否立即感知。
  2. 原子性:操作是否不可分割,避免数据不一致。
  3. 有序性:代码执行顺序是否符合预期。

volatile 关键字

1. 核心特性

  • 可见性保证:所有线程直接访问共享内存中的变量值,而非本地缓存。

    • 写操作:强制将修改后的值刷新到主内存。

    • 读操作:强制从主内存读取最新值。

  • 禁止指令重排序:通过内存屏障限制编译器和处理器的重排序。

2. 使用限制

  • 不保证原子性:仅适用于单次读/写操作,无法处理复合操作(如 i++)。

  • 典型场景

    • 状态标志(如 volatile boolean on = true)。

    • 配合 CAS 操作实现无锁并发(如 AtomicInteger 内部实现)。

3. 示例

public class StatusMonitor {private volatile boolean running = true; // 状态标志public void shutdown() {running = false; // 修改后对所有线程可见}public void doWork() {while (running) { // 实时读取共享内存的值// 执行任务}}
}

synchronized 关键字

1. 核心特性

  • 原子性 & 排他性:同一时刻只允许一个线程进入同步代码。

  • 隐式锁机制:通过锁对象实现同步(锁粒度可以是实例对象、Class 对象或自定义对象)。

  • 可见性保证:线程退出同步代码时,修改的变量值强制刷新到主内存。

  • synchronized 无法完全禁止内部指令重排序,但通过临界区的内存屏障和线程互斥访问机制,对外部线程表现为有序性

  • 在需要严格禁止重排序的高并发场景中(如单例初始化),必须结合 volatile 来补充有序性保证。

2. 示例

public class Counter {private int count = 0;public synchronized void increment() { // 普通同步方法count++; // 原子操作}public static synchronized void staticMethod() { // 静态同步方法// 操作共享资源}public void blockSync() {synchronized (this) { // 同步块count--;}}
}

volatile 与 synchronized 的对比

特性volatilesynchronized
可见性保证保证
原子性仅支持单个读/写操作支持代码块级原子性
排他性有(同一时刻仅一个线程访问)
性能消耗较低(仅内存屏障)较高(涉及锁竞争与上下文切换)
适用场景状态标志、双重检查锁(DCL)复杂操作保护(如转账、计数等)

Volatile 和 Synchronized 最佳实践

  • 双重检查锁定(Double-Checked Locking)
public class Singleton {private static volatile Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton(); // volatile 防止指令重排序}}}return instance;}
}

volatile 在此阻止 JVM 重排序初始化步骤(分配内存与对象构造),确保线程安全。

相关文章:

  • 集成算法学习
  • 具身系列——比较3种vpg算法方式玩CartPole游戏(强化学习)
  • 【Unity】使用XLua进行热修复
  • Ray开源程序 是用于扩展 AI 和 Python 应用程序的统一框架。Ray 由一个核心分布式运行时和一组用于简化 ML 计算的 AI 库组成
  • 4电池_基于开关电容的均衡
  • 项目实战-25年美赛MCM/ICM-基于数学建模与数据可视化的动态系统模型
  • agent初识
  • 0.1 基础阶段错题汇总
  • 前端 uni-app 初步使用指南
  • SpringMVC-第二章之RequestMapping注解详解
  • 一篇撸清 Http,SSE 与 WebSocket
  • 性能优化实践:性能监控体系
  • PyTorch_标量张量和数字的转换
  • React--》掌握react构建拖拽交互的技巧
  • Nginx 核心功能之正反代理
  • 以下是在 Ubuntu 上的几款PDF 阅读器,涵盖轻量级、功能丰富和特色工具:
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的爆品力构建研究
  • Linux网络编程 day3 五一结假
  • 【翻译、转载】MCP 提示 (Prompts)
  • 数据库Mysql_联合查询
  • 上海成五一国内最热门的入境游目的地,国际消费明显提升
  • 马斯克的“星舰基地”成为新城镇,首任市长为SpaceX员工
  • 抗战回望17︱《青年界》:给一般青年供给一些精神的食料
  • 中国驻旧金山总领馆:领区发生旅行交通事故,有中国公民伤亡
  • 月薪3万文科友好,“AI训练师”真有那么赚?
  • 五一当天1372对新人在沪喜结连理,涉外婚姻登记全市铺开