IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:多线程

共 24 篇相关文章

IT 累计浏览 2,259

Beyond Threading

这篇讲的是 Java 线程模型为何能在并发编程中持续占据重要地位。作者从线程模型如何清晰地建模应用逻辑流出发,点明了它的核心优势:将逻辑线程与操作系统的物理线程一一对应,从而能够直接利用多核处理器的并行计算能力;同时,当逻辑线程数量多于物理核心时,又可以通过操作系统调度,让多个线程分时共享同一个处理器,有效提升 CPU 利用率。 文章指出,这种模型为开发者提供了一种直观且强大的抽象,既匹配了现代硬件的架构,又降低了编写高并发代码的认知负担。它特别适合需要明确控制执行流程、同时又要求高性能并发处理的后端服务、计算密集型或 I/O 密集型应用。作者的分析揭示了,正是这种在清晰逻辑与硬件效率之间的平衡,使得传统的线程模型在许多场景下依然是坚实可靠的选择。

IT 累计浏览 5,054

为什么在多线程程序中要慎用volatile关键字?

这篇讲的是在多核时代,程序员为何对volatile关键字需保持警惕。作者从volatile的“可见性”保证出发,指出一个常见误区:许多人认为它能解决线程间的数据同步,但在多线程环境下,它无法保证复合操作的原子性。 文章深入剖析了根本原因:volatile仅确保单个读写操作的即时性,但像i++这类自增操作,在机器码层面包含读取、修改、写回三步,中间仍可能被其他线程打断。这会导致数据竞争与结果不确定。 作者接着对比了volatile与synchronized、Lock等同步机制。volatile轻量、无锁,适合状态标志;而涉及复杂条件判断或需要原子性时,必须使用锁。通过具体代码示例,文章清晰地展示了volatile在计数器等场景下的“坑”,并给出了正确使用同步器的解决方案。 核心结论是:volatile是优化工具而非通用同步方案。在多线程编程中,必须明确区分“可见性”与“原子性”需求,对volatile的使用场景保持清醒认识,才能写出既高效又正确的并发代码。

IT 累计浏览 6,105

学习:一个并发的Cache

这篇讲的是作者从实际需求出发,设计并实现了一个线程安全的缓存包装器 Memoizer。文章的核心在于展示如何利用 Java 的并发工具,优雅地解决“为计算结果缓存”场景下的并发问题。 作者没有选择简单的加锁,而是基于 ConcurrentHashMap 和 FutureTask,构建了一个精妙的方案。当多个线程同时以相同参数调用 compute 时,Memoizer 确保只有第一个线程会真正执行耗时的计算,并将代表该计算结果的 FutureTask 存入缓存。后续线程则直接获取这个 FutureTask,并通过 f.get() 等待结果,从而避免了重复计算。 实现的巧妙之处在于 putIfAbsent 原子操作的运用,它确保了“检查-插入”过程的线程安全。同时,将 FutureTask 作为缓存值,使得计算可以异步进行,而其他调用者可以无阻塞地获取 Future,只是在真正需要结果时才会等待。代码也妥善处理了计算任务被取消或抛出异常的情况,体现了健壮性。 这个实现为我们提供了一个在并发环境下构建高效、线程安全缓存的范本,其思路在优化服务接口性能、避免资源浪费的场景中非常具有启发意义。

IT 累计浏览 3,622

linux下多线程的创建与等待详解

这篇详细讲解了Linux环境下多线程编程的基础知识。文章从线程的唯一标识——线程号(pthread_t)说起,介绍了如何通过pthread_self()获取当前线程ID。核心部分聚焦于线程的创建过程,指明了线程函数必须严格遵循“void * Thread_Function(void *)”的声明格式,并解释了创建线程的常用API。对于刚接触多线程开发的程序员而言,这篇文章清晰地梳理了从理解线程身份到动手创建线程的第一步,是掌握并发编程模型不可或缺的入门指引。