首页
文章列表
标签墙
返回找工具啦
并发编程
共 105 篇文章
Python asyncio.TaskGroup取代gather的结构化并发
2026-05-05 11:19:29
Python asyncio.TaskGroup取代gather的结构化并发 在 Python 异步编程中,管理多个并发任务长期以来依赖于 asyncio.gather。然而,gather 在处理异常和任务取消时存在局限性,往往需要编写大量样板代码来确保“要么全做,要么全不做”。Python 3.1
Python
asyncio
异步编程
49
0
Java线程池ThreadPoolExecutor的饱和策略源码解读
2026-05-05 07:14:09
Java线程池ThreadPoolExecutor的饱和策略源码解读 在使用 ThreadPoolExecutor 时,当线程池的核心线程数已满、任务队列也已满,并且线程数达到最大线程数时,线程池会处于“饱和”状态。此时,新提交的任务将由“饱和策略”进行处理。这四种策略决定了线程池在无法接收新任务时
Java
线程池
饱和策略
43
0
Java StampedLock.validate在乐观读后的验证机制
2026-05-05 03:14:00
Java StampedLock.validate在乐观读后的验证机制 StampedLock 是 Java 8 引入的锁机制,它的核心优势在于支持“乐观读”。乐观读假设在读取数据时没有写操作发生,因此不需要阻塞写线程,也不需要通过 CPU 内存屏障来强制同步缓存,性能极高。但这种假设是有风险的,必
Java并发
乐观读
验证机制
45
0
Java Phaser分阶段同步屏障替代CyclicBarrier的优势
2026-05-04 19:26:51
Java Phaser分阶段同步屏障替代CyclicBarrier的优势 Java并发包(J.U.C)中的 Phaser 是一个功能强大的同步工具,它解决了 CyclicBarrier 和 CountDownLatch 在某些复杂场景下的局限性。Phaser 提供了更灵活的线程同步机制,特别是在线程
Java
并发编程
Phaser
45
0
C++ std::scoped_lock同时锁定多个互斥量避免死锁
2026-05-04 14:29:00
C++ std::scopedlock同时锁定多个互斥量避免死锁 在多线程编程中,当需要同时操作多个共享资源时,如果锁的顺序不一致,极易发生死锁。死锁会导致程序挂起,无法继续执行。C++17 引入了 std::scopedlock,这是一个专门为了解决多锁死锁问题而设计的工具。它不仅能一次性锁定多个
C++编程
多线程
死锁
39
0
Go语言atomic.CompareAndSwap的ABA问题与解决方案
2026-05-03 19:20:18
Go语言atomic.CompareAndSwap的ABA问题与解决方案 并发编程中,atomic 包提供的原子操作是保证数据安全的重要手段。其中 CompareAndSwap(简称 CAS)操作因为无需加锁而被广泛使用。但在特定场景下,CAS 操作存在一个隐蔽的逻辑漏洞,被称为 ABA 问题。以下
Go语言
并发编程
原子操作
46
0
Go语言context.Done()通道在取消时的关闭行为
2026-05-03 08:21:08
Go语言context.Done通道在取消时的关闭行为 在 Go 语言并发编程中,context 包是控制 Goroutine 生命周期的核心工具。理解 context.Done 通道在取消操作时的具体行为,对于编写优雅、不泄露资源的并发程序至关重要。本文将深入剖析 Done 通道的关闭机制,并通过
Go语言
并发编程
Context
45
0
Go语言select在default case下的非阻塞语义
2026-05-03 05:21:18
Go语言select在default case下的非阻塞语义 Go语言的 select 语句是处理多个通道操作的核心机制。通常情况下,select 会阻塞,直到其中一个 case 能够执行。然而,当 select 包含一个 default 分支时,其语义会发生根本性变化:它将不再阻塞,而是立即执行。
Go语言
select
非阻塞
41
0
Go语言Goroutine的GOMAXPROCS与CPU核心数的关系
2026-05-02 21:30:35
Go语言Goroutine的GOMAXPROCS与CPU核心数的关系 GOMAXPROCS 是 Go 语言运行时(runtime)中的一个关键参数,它直接决定了 Go 程序能够同时使用多少个操作系统线程来执行 Go 代码。理解它与 CPU 核心数的关系,是优化 Go 程序并发性能、特别是 CPU 密
Go语言
并发编程
CPU核心数
46
0
Python GIL锁对多线程CPU密集型任务的性能瓶颈分析
2026-05-02 15:14:20
Python GIL锁对多线程CPU密集型任务的性能瓶颈分析 Python 的多线程在处理计算密集型任务时往往无法达到预期的加速效果,甚至可能比单线程更慢。这主要源于 Python 解释器中的全局解释器锁。本文将带你直观地复现这一性能瓶颈,分析其底层原理,并提供切实可行的解决方案。 1. 理解 GI
Python
GIL
多线程
41
0
Go语言通道的happens-before关系与内存可见性
2026-05-02 09:27:38
Go语言通道的happensbefore关系与内存可见性 Go语言的并发模型以通道为核心,理解通道的 happensbefore 关系是编写无数据竞争代码的关键。happensbefore 是内存模型中的术语,用于保证一个操作的结果对另一个操作可见。掌握这套规则,能让你在不依赖锁的情况下,安全地在
Go语言
并发编程
通道
45
0
Java ForkJoinPool的工作窃取算法如何提升CPU利用率
2026-05-02 04:20:21
传统线程池在处理大量细粒度任务时,常因线程阻塞或任务分配不均导致 CPU 空转。Java 的 ForkJoinPool 通过“工作窃取”算法解决了这一痛点,让每个线程都能保持忙碌状态。以下是该算法的核心原理及其实操指南。 1. 理解工作窃取机制 传统线程池通常使用一个共享任务队列,所有线程从这个队列
Java
ForkJoin
工作窃取
49
0
Go语言time.After与context.WithTimeout的超时精度对比
2026-05-01 21:18:31
Go语言time.After与context.WithTimeout的超时精度对比 Go语言在处理并发超时控制时,主要提供两种机制:time.After 和 context.WithTimeout。虽然两者在底层都依赖相同的运行时计时器,但在资源管理、控制精度以及对高并发场景的适应性上存在显著差异。
Go语言
并发编程
超时控制
47
0
Java ConcurrentHashMap在JDK8中为什么放弃分段锁
2026-05-01 16:23:32
Java ConcurrentHashMap在JDK8中为什么放弃分段锁 Java 8 对 ConcurrentHashMap 进行了彻底的重构,彻底摒弃了 Java 7 中使用的“分段锁”机制,转而采用了 CAS + synchronized 的组合方式。这一改变并非为了标新立异,而是为了解决旧设
Java
JDK8
分段锁
59
0
Go语言atomic.Value的Store与Load的原子性保证
2026-05-01 05:25:06
Go语言atomic.Value的Store与Load的原子性保证 Go语言中的 atomic.Value 提供了一种无需加锁即可并发安全地读写特定类型值的机制。其核心方法 Store 和 Load 保证了操作的原子性,但正确使用它们需要理解其底层的内存模型和类型约束。本文将直接演示如何利用 ato
Go语言
并发编程
原子操作
43
0
Java ThreadPoolExecutor.CallerRunsPolicy的饱和处理风险
2026-05-01 01:14:00
Java ThreadPoolExecutor.CallerRunsPolicy的饱和处理风险 CallerRunsPolicy 是 Java 线程池中一种看似“温柔”的饱和拒绝策略。当线程池队列满了,且线程数达到最大值时,它既不抛异常,也不丢任务,而是让调用者线程自己去执行这个任务。 这种设计原本
Java
线程池
拒绝策略
54
0
Go语言sync.Cond与channel在条件等待中的选择
2026-04-30 09:20:22
Go语言sync.Cond与channel在条件等待中的选择 在Go语言的并发编程中,让一个Goroutine等待特定条件成立是常见需求。Go标准库提供了sync.Cond(条件变量)和channel(通道)两种机制来实现这一功能。虽然两者都能达到“等待”和“通知”的目的,但它们的适用场景和底层逻辑
Go语言
并发编程
sync.Cond
52
0
Python concurrent.futures.ProcessPoolExecutor的进程复用机制
2026-04-30 04:28:05
Python concurrent.futures.ProcessPoolExecutor的进程复用机制 利用多进程进行并行计算时,频繁地创建和销毁进程会消耗大量系统资源,导致程序性能下降。concurrent.futures.ProcessPoolExecutor 通过维护一个固定数量的进程池,实
Python
多进程
进程池
50
0
Java volatile为什么能禁止指令重排序:内存屏障原理
2026-04-29 23:15:22
Java volatile为什么能禁止指令重排序:内存屏障原理 在Java多线程编程中,代码的执行顺序往往并不等同于源代码的编写顺序。编译器和处理器为了优化性能,会对指令进行重排序。在单线程环境下,这种优化不会影响结果,但在多线程环境下,指令重排会导致严重的并发安全问题。volatile 关键字正是
Java
volatile
指令重排序
56
0
Go语言channel的select与default的非阻塞发送实现
2026-04-29 11:20:30
在 Go 语言并发编程中,直接向 channel 发送数据通常会阻塞当前 goroutine,直到接收者准备好。这种机制虽然保证了数据同步,但在某些高吞吐或对延迟敏感的场景下,我们更希望发送操作能够“立即返回”,如果 channel 满了则放弃或执行备用逻辑,而不是死等。利用 select 语句配合
Go语言
并发编程
Channel
46
0
上一页
1
2
3
4
5
6
下一页