并发编程 共 105 篇文章

Go recover 为什么只能拦截当前 Goroutine 的 panic 而无法跨协程
2026-05-24 15:14:21
Go recover 为什么只能拦截当前 Goroutine 的 panic 而无法跨协程 理解 panic 与 recover 的本质 思考一个场景:你和同事各自负责独立的项目模块,你在工作中遇到了一个无法解决的致命错误(panic)。你需要的是在自己负责的范围内尝试修复或妥善处理这个错误(rec
Go语言 panic机制 recover机制
4 0
Go 语言 Goroutine 泄漏的常见模式与 runtime.NumGoroutine 监控
2026-05-24 09:21:08
Go 语言 Goroutine 泄漏的常见模式与 runtime.NumGoroutine 监控 Goroutine 泄漏是 Go 程序中一种隐蔽且危害巨大的资源问题。泄漏的 Goroutine 会持续消耗内存和调度资源,最终拖垮整个服务。本文将直接介绍几种最典型的泄漏模式,并提供一套基于 runt
Go语言 Goroutine泄漏 并发编程
4 0
Go sync.Cond 为什么必须在 Wait 前加锁与伪唤醒的防范
2026-05-24 03:13:13
Go sync.Cond 为什么必须在 Wait 前加锁与伪唤醒的防范 Go 语言的 sync.Cond 是一个强大的同步原语,用于在共享状态发生变化时通知等待的 goroutine。然而,它的使用比 mutex 和 channel 更容易出错。本文将直接剖析两个核心问题:为什么 Wait 方法调用
Go语言 sync.Cond Wait方法
8 0
Go context.WithValue 为什么不适合用来传递业务参数
2026-05-23 18:09:25
Go context.WithValue 为什么不适合用来传递业务参数 在Go语言的并发编程中,context 包是一个核心工具,用于在goroutine之间传递截止时间、取消信号和请求范围的值。其中,context.WithValue 函数似乎提供了一种便捷的方式,在调用链中“捎带”一些数据。但许
Go语言 context.WithValue 业务参数
8 0
Java Phaser 同步屏障为什么比 CyclicBarrier 更适合动态注册任务
2026-05-22 15:19:38
Java Phaser 同步屏障为什么比 CyclicBarrier 更适合动态注册任务 在需要多个线程同步完成某个阶段任务,然后才能一起进入下一阶段的场景中,CyclicBarrier 是一个常用的工具。但当参与同步的线程数量在运行时可能发生变化,或者任务被动态划分时,CyclicBarrier
JavaPhaser 同步屏障 CyclicBarrier
16 0
Java StampedLock的乐观读失败后转换为悲观读锁
2026-05-17 23:30:38
Java StampedLock的乐观读失败后转换为悲观读锁 Java 并发包中的 StampedLock 提供了一种乐观读机制,通常比标准的 ReentrantReadWriteLock 更快。它的核心思路是:先试着读数据,如果发现数据正在被修改,再升级为悲观读锁。 核心操作流程 乐观读不会阻塞写
Java 并发编程 乐观读
31 0
Java Semaphore信号量实现限流与资源池控制
2026-05-15 18:21:35
Java Semaphore信号量实现限流与资源池控制 Java并发编程中,Semaphore(信号量)是一种核心同步工具,用于控制同时访问特定资源的线程数量。它通过维护一组“许可”,精确限制并发线程数,广泛应用于接口限流、数据库连接池控制等场景。 核心原理解析 Semaphore 的核心逻辑基于“
Java 并发编程 信号量
32 0
Go语言Map并发读写panic的复现与sync.Map的替代方案
2026-05-15 15:21:41
Go语言Map并发读写panic的复现与sync.Map的替代方案 Go语言的原生map并不支持并发读写操作。如果在多个协程中同时对同一个map进行读写,程序会直接触发panic导致崩溃。本文将指导你如何复现这一问题,并提供两种标准解决方案。 一、 复现并发读写Panic 通过一段简单的代码,可以快
Go语言 并发编程 Map
33 0
Java CompletableFuture组合异步操作的超时处理策略
2026-05-14 18:19:34
Java CompletableFuture组合异步操作的超时处理策略 在异步编程中,单个任务的超时控制相对简单,但多个 CompletableFuture 组合操作(如并行执行、链式调用)的超时处理往往容易失控。若未正确设置超时,系统线程可能被长时间阻塞,导致资源耗尽。 本文将针对三种常见场景,提
Java 异步编程 超时处理
44 0
Go语言sync.Once为什么能保证只执行一次
2026-05-11 04:40:26
Go语言sync.Once为什么能保证只执行一次 sync.Once 是 Go 标准库中一个非常实用的工具,用于确保某个操作在程序运行期间只执行一次。无论有多少个 goroutine 调用 Do 方法,传入的函数都只会被执行一次。这种机制在单例模式、资源初始化等场景中非常有用。本文将深入剖析 syn
Go语言 sync.Once 并发编程
46 0
Java ThreadPoolExecutor的allowCoreThreadTimeOut配置
2026-05-10 13:18:15
Java ThreadPoolExecutor的allowCoreThreadTimeOut配置 Java的ThreadPoolExecutor是线程池的核心实现,用于管理线程的生命周期和任务执行。其中,allowCoreThreadTimeOut是一个关键配置,它决定了核心线程是否可以超时并终止。
Java线程池 核心线程超时 线程管理
33 0
Go语言select在多个case同时就绪时的选择概率分布
2026-05-10 00:11:31
Go语言select在多个case同时就绪时的选择概率分布 引言 Go语言的select语句用于从多个channel操作中选择一个执行。当多个case同时就绪时,select会选择其中一个执行,但具体的选择机制和概率分布是许多开发者关心的问题。 select基本概念 select语句是Go语言中处理
Go语言 select语句 概率分布
35 0
Go语言Select语句的伪随机选择机制源码解析
2026-05-09 07:27:00
Go语言的select语句是并发编程中处理多个通道(channel)操作的关键工具。当select语句中存在多个可执行的case时,Go运行时会从中随机选择一个执行。这种“随机”并非完全的随机,而是基于特定算法实现的“伪随机”。本文将深入Go运行时源码,解析select语句的伪随机选择机制。 1.
Go语言 Select语句 并发编程
46 0
Java CAS操作的ABA问题与AtomicStampedReference的解决
2026-05-09 01:16:40
Java CAS操作的ABA问题与AtomicStampedReference的解决 Java中的CAS(CompareAndSwap)是一种无锁算法,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值,如果相等则更新为新值,否则不做任何操作。这种机制在java.util.concurre
Java CAS ABA问题
63 0
Go语言Goroutine泄漏检测:pprof与runtime.NumGoroutine
2026-05-07 16:26:14
Go语言Goroutine泄漏检测:pprof与runtime.NumGoroutine Goroutine泄漏是Go语言开发中常见且隐蔽的问题。当一个Goroutine被创建但未能正常退出,且系统不断创建此类Goroutine时,内存和CPU资源会被耗尽,导致服务崩溃。本文将指导你如何通过代码监控
Go语言 Goroutine泄漏 pprof
41 0
Java Thread.sleep与Object.wait的锁释放行为差异
2026-05-06 21:15:51
Java Thread.sleep与Object.wait的锁释放行为差异 Java 多线程编程中,控制线程暂停的两种最常见方式是 Thread.sleep 和 Object.wait。虽然它们都能让线程停止运行,但在锁的释放行为上有着本质的区别。理解这一差异对于避免死锁和提高并发性能至关重要。 1
Java 多线程 并发编程
43 0
Java Thread.interrupt()方法对阻塞IO的局限性
2026-05-06 12:19:00
Java Thread.interrupt方法对阻塞IO的局限性 在 Java 多线程编程中,开发者习惯使用 Thread.interrupt 方法来请求停止线程。对于正在执行计算任务或处于 wait、sleep 状态的线程,该方法通常能立即生效。然而,当线程陷入传统的阻塞 IO(Blocking
Java 多线程 线程中断
54 0
Java Exchanger线程间交换数据的同步工具
2026-05-06 03:23:01
Java Exchanger线程间交换数据的同步工具 Java Exchanger 是一个用于线程间协作的同步工具类,它允许两个线程在汇合点交换数据。它提供了一个同步点,在这个同步点,两个线程可以互换数据。这种设计模式非常适合像“生产者消费者”模式中,生产者需要缓冲区而消费者需要数据,或者遗传算法中
Java并发 多线程 线程同步
40 0
Go语言sync.WaitGroup的Add和Done不匹配导致死锁
2026-05-06 00:19:44
Go语言sync.WaitGroup的Add和Done不匹配导致死锁 Go 语言中的 sync.WaitGroup 是用于等待一组 Goroutine 完成执行的同步原语。死锁通常发生在 Add 增加的计数器与 Done 减少的计数器数量不一致,或者 Wait 被调用时计数器非零的情况下。解决此问题
Go语言 死锁 并发编程
38 0
Go语言竞态条件在map并发读写时的崩溃复现
2026-05-05 19:20:00
Go语言竞态条件在map并发读写时的崩溃复现 Go 语言内置的 map 类型并不支持并发安全读写。当多个 goroutine 同时对同一个 map 进行写入或读写混合操作时,程序会抛出 fatal error 并崩溃。本指南将直接复现这一经典崩溃场景,并演示如何使用 Go 的竞态检测工具定位问题。
Go语言 并发编程 竞态条件
42 0