随笔分类 - [后端技术栈] 并发编程
摘要:一、为什么需要线程池?🤔 1.1 传统线程管理的痛点 问题场景: // 传统方式:为每个任务创建新线程 for (int i = 0; i < 1000; i++) { new Thread(() -> { // 执行任务 processTask(); }).start(); } // 结果:系统
阅读全文
摘要:在多线程并发环境下,保证数据操作的原子性是个常见且关键的挑战。Java从JDK 1.5开始提供了java.util.concurrent.atomic包,其中包含13个强大的原子操作类,让我们能够以无锁的方式实现线程安全。本文将带你深入理解这些原子类的原理、API和使用场景。 一、为什么需要原子操作
阅读全文
摘要:上篇讲了Lock锁、AQS相关的内容,本篇讲一下线程安全的类,拿来即用无需其他操作就能达到线程安全的效果,省力又省心 ~ ~ 你是否曾为多线程编程中的各种坑而头疼?本文将用生动比喻和实用代码,带你轻松掌握Java并发容器的精髓,让你的多线程程序既安全又高效! 引言:为什么我们需要并发容器? 想象一下
阅读全文
摘要:1. 锁的基本概念:从现实世界到代码世界 1.1 锁的演进:synchronized → Lock 想象一下健身房储物柜的使用场景: synchronized:像固定密码锁 - 简单易用但功能有限 Lock接口:像智能电子锁 - 功能丰富且灵活可控 // synchronized - 固定密码锁 p
阅读全文
摘要:本篇主要是多线程的基础知识,代码示例较多,有时间的可以逐个分析,具体细节都放在代码注释中了。 1. 理解线程:多任务执行的基石 1.1 什么是线程? 在现代操作系统中,进程是资源分配的基本单位,而线程是CPU调度的最小单位。可以把进程想象成一家公司,线程就是公司里的员工。 /** * 演示Java程
阅读全文
摘要:你是否曾经遇到过:明明单线程运行正常的代码,在多线程环境下就出现各种诡异问题?一个线程修改了变量,另一个线程却看不到?代码的执行顺序好像和写的不一样?今天,就让我们彻底揭开Java内存模型的神秘面纱! 1. 引言:为什么需要内存模型? 想象一下这个场景: public class Visibilit
阅读全文
摘要:1. 引言:为什么需要理解内存模型? 在多核处理器成为主流的今天,并发编程已成为每个Java程序员的必备技能。然而,编写正确的并发程序远比单线程程序复杂,主要原因在于我们需要处理两个核心问题: 线程之间如何通信? 线程之间如何同步? Java内存模型(JMM)正是为了解决这些问题而设计的抽象概念。理
阅读全文
摘要:深入理解volatile、synchronized和原子操作的实现机制,掌握高并发编程的核心原理 引言:为什么需要了解底层原理? 在日常开发中,我们经常使用volatile、synchronized和原子类来解决并发问题。但仅仅会使用这些工具是不够的,只有深入理解它们的底层实现原理,才能在复杂的并发
阅读全文
摘要:一、任务创建操作 1. runAsync() - 执行无返回值的异步任务 /** * 创建并执行无返回值的异步任务 * * @param runnable 要执行的任务逻辑(无返回值) * @return CompletableFuture<Void> 表示任务执行状态的Future对象 * * 特
阅读全文
摘要:今天泡杯茶,深入聊聊咱们的老朋友——ReentrantLock。平时用 synchronized 关键字挺顺手,但一旦想玩点高级的,比如公平锁、尝试获取锁、可中断获取锁,那就得请出 ReentrantLock 了。咱们不光要会用,还得掀开它的盖子,看看里面的发动机(AQS)是怎么转的。 为了让咱们的
阅读全文
摘要:1. Java自带的线程池?有哪些实现? Java通过Executors工厂类提供了几种快速创建线程池的便捷方法。这些方法内部都是通过ThreadPoolExecutor或ForkJoinPool的不同参数配置来实现的。 主要实现有: newFixedThreadPool(int nThreads)
阅读全文
摘要:引言:一场值得深思的设计抉择 在Java集合框架的浩瀚宇宙中,ConcurrentHashMap(以下简称CHM)无疑是最耀眼的明星之一。作为高并发环境的王者,它以其卓越的性能和线程安全性征服了无数开发者。但这位王者有一个看似"不近人情"的原则:坚决拒绝null作为key或value。 这个设计决策
阅读全文
摘要:在Java高并发编程中,线程安全是永恒的话题。ThreadLocal作为解决线程安全的利器之一,其精妙的设计思想值得我们深入探讨。本文将全面剖析ThreadLocal的实现原理、使用场景和内存泄漏问题,带您彻底掌握这一重要并发工具。 一、ThreadLocal的本质:线程级变量隔离 1.1 什么是T
阅读全文
摘要:引言:异步编程的演进之路 在当今高并发、分布式系统盛行的时代,异步编程已成为现代Java开发的必备技能。Java 8引入的CompletableFuture不仅解决了传统Future的阻塞问题,更提供了强大的任务组合能力,让我们能够以声明式的方式构建复杂的异步流程。 本文将深入剖析Completab
阅读全文
摘要:在Java并发编程中,java.util.concurrent包提供了强大的工具类来简化线程间的协调工作。本文将深入探讨三个核心工具:CountDownLatch、CyclicBarrier和Semaphore,分析它们的原理、应用场景和关键区别,并提供实用的代码示例。 一、核心工具详解 1. Co
阅读全文
摘要:StampedLock 的乐观读机制主要解决了读多写少场景下,传统读写锁(如 ReentrantReadWriteLock)可能存在的写线程饥饿或性能瓶颈问题。它通过一种“乐观”的策略,允许读操作在特定条件下完全不阻塞写操作,从而显著提高系统的整体吞吐量。 解决的问题 写线程饥饿: 在传统的读写锁(
阅读全文
摘要:一、读写锁的核心价值 在多线程编程中,同步机制是保证线程安全的关键。传统的互斥锁(如synchronized)在读多写少的场景下存在明显性能瓶颈:读操作被不必要的串行化,即使多个线程只读取数据也会相互阻塞。这正是ReentrantReadWriteLock的用武之地! 读写锁的优势 读读并发:多个线
阅读全文
摘要:锁本身作为共享资源却能保证线程安全,以及AtomicInteger等原子类的线程安全实现,其根本原因都依赖于硬件层面的原子操作指令和内存屏障。下面分层解析其原理: 一、锁如何保证自身线程安全(以 ReentrantLock 为例) 1. 底层依赖:CAS (Compare-And-Swap) //
阅读全文
摘要:合理配置线程池参数是高性能、稳定并发应用的关键。这是一个需要结合具体业务场景、硬件资源和性能目标的权衡过程。以下是核心参数的配置策略和关键监控指标: 一、线程池核心参数配置策略 参数 含义 配置原则 场景示例 corePoolSize 核心线程数 - CPU密集型:N_cpu + 1 (N_cpu
阅读全文
摘要:常见的线程池饱和策略及使用场景 当线程池的任务队列已满且线程数达到最大值时,新的任务会触发饱和策略(拒绝策略)。Java 提供了四种默认策略: AbortPolicy(默认策略) 行为:直接抛出 RejectedExecutionException 异常。 适用场景: 需要严格保证任务不丢失的场景(
阅读全文

浙公网安备 33010602011771号