Java并发编程
文章平均质量分 92
深入Java并发编程原理,实战经验分享
帧栈
聚焦java全栈开发实战经验分享。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
并发编程原理与实战(三十八)高并发利器ConcurrentHashMap 数据结构与核心API深度剖析
本文分析了ConcurrentHashMap的核心数据结构和API方法。其数据结构采用数组+链表+红黑树的形式,包含基础Node节点和四个子类节点:TreeBin/TreeNode用于红黑树管理、ForwardingNode处理扩容转发、ReservationNode作为计算操作的占位符。核心方法putVal()通过CAS+synchronized实现线程安全,支持链表转红黑树等优化操作。这些设计共同构成了ConcurrentHashMap高效并发的基础架构。原创 2025-11-20 20:29:37 · 1049 阅读 · 1 评论 -
并发编程原理与实战(三十七)高并发利器ConcurrentHashMap核心特性解析
1、引入ConcurrentHashMap主要是为了解决HashMap在多线程环境下的线程安全问题,并克服Hashtable因全局锁导致的性能瓶颈。2、一个支持检索操作完全并发且更新操作具有高预期并发性的哈希表。所有操作都是线程安全的,但检索操作不涉及锁机制,且不支持锁定整个表以阻止所有访问。3、检索操作反映的是在其开始时已完成的最近更新操作的结果。4、当发生过多碰撞(即具有不同哈希码但根据表大小取模后落入同一槽位的键)时,哈希表会动态扩容。原创 2025-11-20 11:25:38 · 687 阅读 · 0 评论 -
并发编程原理与实战(三十六)深入解析 ThreadLocal 在 Spring 框架中的核心应用与实战技巧
摘要:本文探讨了ThreadLocal在Spring框架中的核心应用场景,包括用户信息存储和数据库连接管理。在Web应用中,通过ThreadLocal实现拦截器存储用户信息,避免参数传递;在数据库事务中,Spring通过NamedThreadLocal管理连接资源,确保同一线程使用相同的Connection对象。文章还分析了Spring事务管理的调用链,解释了CGLIB代理的选用原因。这种线程本地变量机制有效解决了多线程环境下的数据隔离问题,是Spring框架的重要实现基础。原创 2025-11-11 20:45:09 · 1151 阅读 · 0 评论 -
并发编程原理与实战(三十五)ThreadLocal内存泄露问题剖析与典型使用场景举例
摘要:本文分析了ThreadLocal内存泄漏问题,指出其根本原因在于ThreadLocalMap中Entry的key采用弱引用(ThreadLocal对象)而value是强引用,导致key被回收后value仍占据内存。通过示例演示了未调用remove()方法时老年代内存持续增长的现象,并提出了防护策略:1)显式调用remove()清理;2)使用static final修饰ThreadLocal;3)设置合理初始值。文中还详细介绍了Java四种引用类型及其特性,为理解内存泄漏机制提供了理论基础。原创 2025-11-04 00:04:03 · 874 阅读 · 0 评论 -
并发编程原理与实战(三十四)ThreadLocal核心API与线程安全数据隔离机制深度解析
通过分析ThreadLocal的核心API,我们总结出ThreadLocal线程安全的数据隔离机制:1、ThreadLocal通过为每个线程创建独立的局部变量来实现线程安全的数据隔离,其核心机制基于Thread、ThreadLocal和ThreadLocalMap三者的协作。2、每个Thread对象内部维护一个ThreadLocalMap实例作为线程的私有存储空间。原创 2025-10-21 19:38:24 · 1442 阅读 · 0 评论 -
并发编程原理与实战(三十三)AQS框架下手写简易可重入锁的实战解析
本文基于AQS框架实现自定义可重入锁,分析锁的核心特性(可重入性、公平性、中断机制等)及其实现方式。通过创建继承AQS的Sync内部类,重写tryAcquire、tryRelease等方法,利用AQS提供的state状态管理和CLH队列实现线程同步。代码实现部分展示了如何构建Lock接口的基本框架,并重点解析了独占模式下关键方法的实现逻辑,为深入理解锁机制和AQS原理提供了实践案例。原创 2025-09-29 19:39:14 · 1073 阅读 · 0 评论 -
并发编程原理与实战(三十二)AQS核心机制与使用示例解读
前面的系列文章,我们主要学习了线程基础、线程并发协同工具类、线程安全、锁、原子类等内容。有了前面的这些知识,接下来我们来学习Java并发编程中线程协作工具统一的底层框架AbstractQueuedSynchronizer,简称AQS。原创 2025-09-24 19:32:44 · 1298 阅读 · 0 评论 -
并发编程原理与实战(三十一)从原子类到CPU原子指令,CAS实现全链路拆解
在前面学习原子类的核心API过程中,CAS方法compareAndSet(int expect, int update)是每个原子类的核心方法,本文来深入这一核心算法底层的实现原理。原创 2025-09-21 19:37:49 · 1143 阅读 · 0 评论 -
并发编程原理与实战(三十)原子操作进阶,原子数组与字段更新器精讲
上两篇文章学习了int、long、boolean三种基本数据类型以及引用数据类型对应的原子类。JDK中对这几种数据类型的数组提供了相应的原子类,文本就来学习数组的原子类。原创 2025-09-18 20:20:06 · 1005 阅读 · 0 评论 -
并发编程原理与实战(二十九)原子引用类型详解、ABA问题原理与防护策略
上一篇学习了AtomicInteger的核心api,本文继续学习原子引用类型。原创 2025-09-17 19:42:33 · 866 阅读 · 0 评论 -
并发编程原理与实战(二十八)深入无锁并发演进,AtomicInteger核心API详解与典型场景举例
Java原子类演进背景及核心类详解 摘要:为应对高并发场景下传统锁机制的性能瓶颈,Java 1.5引入原子类(Atomic Classes)。原子类基于CAS实现无锁并发,避免了线程阻塞,提供轻量高效的同步方案。核心原子类AtomicInteger、AtomicLong和AtomicBoolean针对基本数据类型提供原子操作。以AtomicInteger为例,其核心方法包括: 初始化方法:支持指定初始值或默认0值 值操作:set/get方法实现变量访问 原子增减:getAndIncrement()等系列方法原创 2025-09-10 20:16:59 · 1310 阅读 · 0 评论 -
我的创作纪念日
主要目的还是通过写作进一步加深对知识的理解,形成自己的知识框架。其次记录项目开发过程的遇到的问题,丰富自己的项目经验。原创 2025-09-08 23:59:05 · 185 阅读 · 0 评论 -
并发编程原理与实战(二十七)深入剖析synchronized底层基石ObjectMonitor与对象头Mark Word
本文深入分析了synchronized底层实现依赖,分析了JVM ObjectMonitor结构体的组成,最后分析了java对象头的Mark Word组成部分,简要分析了synchronized锁优化过程以及java对象(锁对象)与Monitor对象的关联的过程。synchronized的底层实现涉及的内容很多,就拿对象头Mark Word来讲,其组成部分就有很多项,我们的主要目的还是围绕问题来分析,在此我们不做更多深入的分析。原创 2025-09-08 19:59:18 · 1718 阅读 · 0 评论 -
并发编程原理与实战(二十六)深入synchronized底层原理实现
锁在保证线程安全的过程中起着关键性的作用。在第二篇文章和第十五篇文章中,我们对锁以及synchronized关键字已经有了一定的了解。下面我们对synchronized的进步一学习,深入分析其底层的实现原理。原创 2025-08-25 21:39:13 · 2320 阅读 · 0 评论 -
并发编程原理与实战(二十五)手写简易线程池实战,剖析线程状态转换过程
本文开头先是讲解了线程的运行状态枚举,最后通过手写简易线程池的方式,分析线程池内部线程的运行过程,通过这个过程演示线程运行状态的变化过程,希望能让大家深刻理解线程状态的转换过程而不是死记硬背。原创 2025-08-21 21:38:36 · 1738 阅读 · 0 评论 -
并发编程原理与实战(二十四)Java并发基石LockSupport park/unpark机制全解析
前面的文章我们已经学习了synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock等多种锁,这些锁都是多线程并发协同的重要工具,本文来学习另一个提供了一种低开销、高灵活的多线程控制方式的工具LockSupport,Java并发工具链的底层基石之一。LockSupport用于创建锁及其他同步类的基础线程阻塞原语。本类为每个调用线程关联一个许可(概念类似于 java.util.concurrent.Semaphore信号量)。调用park方法时原创 2025-08-18 20:09:55 · 1460 阅读 · 0 评论 -
并发编程原理与实战(二十三)StampedLock应用实战与各种锁性能对比分析
本文通过官方提供的多线程更新坐标并计算到原点的距离这个例子,说明了StampedLock的应用,然后通过设计不同的读写线程,分析读写坐标时的数据一致性,最后通过用ReentrantLock和synchronized分别对读取坐标进行加锁,对比了与StampedLock 乐观锁实现的耗时。通过该例子,进一步加深了对StampedLock 的理解。原创 2025-08-14 21:31:32 · 1224 阅读 · 0 评论 -
并发编程原理与实战(二十二)深入锁的演进,为什么有了ReadWriteLock还需要StampedLock?
StampedLock是Java 8引入的增强型读写锁,解决了传统读写锁可能导致的写锁饥饿问题。它提供三种访问模式:写模式(独占访问)、读模式(共享访问)和创新的乐观读模式(无锁读取)。乐观读通过先获取版本号后验证的方式,在读多写少场景中显著提升性能。此外,StampedLock支持模式间的条件转换(如读锁升级为写锁),但需要注意其不可重入性及乐观读的数据一致性风险。该锁适合作为线程安全组件的内部工具,要求开发者充分理解被保护数据的特性和使用场景。原创 2025-08-12 19:08:47 · 996 阅读 · 0 评论 -
并发编程原理与实战(二十一)深入锁的演进,为什么有了ReentrantLock还需要ReadWriteLock?
摘要: ReadWriteLock(读写锁)通过分离读锁和写锁提升并发性能,读锁允许多线程共享,写锁保持独占。其适用于读多写少的场景(如高频查询的目录系统),性能优势取决于读写频率比、操作耗时及线程争用强度。实现时需考虑锁分配策略(如写优先/读优先/公平)、锁重入性及升降级机制。实际应用中,需结合性能测试评估是否采用,因为短读操作可能使锁开销反超收益,而频繁写入会削弱并发优势。读写锁通过精细的并发控制,在特定场景下比互斥锁更具效率。原创 2025-08-07 08:31:35 · 1266 阅读 · 0 评论 -
并发编程原理与实战(二十)ReentrantLock与Condition实战应用解析
本文以多线程依次输出123456...的经典例子来讲解ReentrantLock+Condition的使用,并与采用synchronized与wait+notify实现方案进行对比,体现了ReentrantLock+Condition更精细的并发协同控制优势。最后通过分析ReentrantLock在ArrayBlockingQueue的具体应用,进一步加深了对ReentrantLock+Condition使用的理解。原创 2025-08-04 07:30:00 · 1364 阅读 · 0 评论 -
并发编程原理与实战(十九)精细并发协同控制接口Condition全面剖析
摘要:本文深入探讨了Java并发编程中的Condition接口,作为ReentrantLock实现多条件协调的核心工具。Condition通过分离Object的wait/notify机制,支持多等待集,实现线程间精细协调。文章解析了Condition作为条件变量的特性,包括原子性释放锁和线程挂起行为,并通过经典的有界缓冲区示例展示了如何利用多个Condition实例优化线程通知。同时指出Condition实现可能具有的特殊语义(如通知顺序保证),并警告开发者避免错误使用Condition对象作为监视器锁,强原创 2025-07-28 08:02:03 · 1386 阅读 · 0 评论 -
并发编程原理与实战(十八)ReentrantLock API全面解析
本文介绍了ReentrantLock实现类的主要特性,包括其可重入互斥锁的基本行为和语义,以及相比synchronized的扩展功能。重点分析了ReentrantLock的公平性设置(通过构造函数参数控制),推荐的使用模式(lock-try-finally-unlock结构),以及线程安全的状态查询方法。文章还说明了ReentrantLock支持递归加锁(最大2147483647层)和序列化特性,并指出其公平锁虽能避免饥饿但会降低吞吐量。最后提到ReentrantLock提供了监控锁状态的方法,这些方法主要原创 2025-07-21 07:48:16 · 2201 阅读 · 0 评论 -
并发编程原理与实战(十七)Lock接口API详解与优势举例
本文详细解析了Lock接口的核心API方法。首先介绍了lock()方法,用于获取锁,若锁不可用则线程进入休眠等待状态。其次讲解了lockInterruptibly()方法,支持在阻塞期间响应线程中断。接着分析了tryLock()方法,它能立即返回获锁结果,适用于快速失败场景。最后阐述了带超时参数的tryLock(long time, TimeUnit unit)方法,在指定时间内尝试获取锁。这些方法相比synchronized关键字提供了更灵活的锁控制能力,包括可中断、可尝试获取等特性,为并发编程提供了更多原创 2025-07-18 07:35:09 · 1279 阅读 · 0 评论 -
并发编程原理与实战(十六)深入锁的演进,为什么有了synchronized还需要Lock?
本文对比分析了synchronized与Lock接口的差异,指出Lock提供了更灵活的锁机制:支持非阻塞获取(tryLock)、可中断锁(lockInterruptibly)和超时获取(tryLock)。Lock允许跨作用域加解锁,实现"链式锁定"等复杂场景,而synchronized强制块结构锁定。尽管Lock需手动释放(需配合try-finally),但其扩展功能(如公平性、死锁检测)和关联多个Condition的特性,使其更适合高并发复杂场景。原创 2025-07-10 17:46:30 · 1298 阅读 · 0 评论 -
并发编程原理与实战(十五)线程安全实现方法深度解析
本文先是讲解了JMM的8大Happens-before 规则,然后结合之前讲解过的8大原子操作,用经典的双重检查加锁单例模式代码实现来分析底层运行过程以及保证线程安全的方法,希望通过具体化的实例讲解加深对线程安全以及JMM相关知识的理解。原创 2025-07-03 07:00:00 · 1011 阅读 · 0 评论 -
并发编程原理与实战(十四)详解线程安全与java内存模型
本文开头先是用三个例子来说明多线程环境下变量的可见性、指令重排、原子性问题,由此引出线程安全问题,然后从官方的角度讲解了java内存模型的概念和核心原理,希望通过理解了java内存模型的核心原理来深刻理解产生线程安全问题的根本原因。原创 2025-06-27 07:40:55 · 780 阅读 · 0 评论 -
并发编程原理与实战(十三)详解数据交互利器Exchanger
本文讲解了交换器、插槽、单槽与多槽、碰撞跟踪、三阶段等待策略等概念,然后详细讲解了Exchanger的几个核心方法,最后通过生产者-消费者数据交换、双缓冲区数据交换两个场景,举例说明了Exchanger的实际使用。原创 2025-06-03 07:54:03 · 1004 阅读 · 0 评论 -
并发编程原理与实战(十二)并发协同利器Phaser之应用举例与总结
本文分析如何将Phaser运用到具体的实际场景中,并对CountDownLatch、CyclicBarrier、Semaphore、Phaser这四个多线程并发协同工具类做了对比总结。原创 2025-05-30 09:05:22 · 995 阅读 · 0 评论 -
并发编程原理与实战(十一)并发协同利器Phaser之方法详解
类别核心方法应用场景构造函数创建相位器实例线程注册与注销增加或者减少参与者线程同步控制线程阶段协同运行控制阶段终止控制阶段转换时的行为逻辑状态查询监控相位器的运行状态如果文章对您有帮助,不妨“帧栈”一下,关注“帧栈”公众号,第一时间获取推送文章,您的肯定将是我写作的动力!原创 2025-05-28 19:13:10 · 1526 阅读 · 0 评论 -
并发编程原理与实战(十)并发协同利器Phaser之概念详解
本位介绍了Phaser相位器的概念和使用场景,讲解了线程在Phaser相位器上注册与注销的概念、Phaser相位器中阶段号的概念、Phaser相位器分层的背景与作用,最后讲解了相位器监控的一些常用方法,希望通过系统的学些这些概念能加深对Phaser相位器的了解。原创 2025-05-26 08:52:14 · 1202 阅读 · 0 评论 -
并发编程原理与实战(九)限流利器信号量的最佳实践分析
本文讲解了信号量隔离的概念,并用一个简单的例子说明用信号量来控制并发调用接口的线程数量的实现过程,然后分析了信号量在Hystrix的运用,讲解了Hystrix中的隔离策略,详细分析了Hystrix中信号量的定义方式、信号量的创建和使用。原创 2025-05-24 16:06:28 · 1424 阅读 · 0 评论 -
并发编程原理与实战(三)一步步剖析线程返回值
本文一步步分析了线程返回值的来龙去脉,总结下过程:1、Thread类只接收Runnable类型的任务但是没有返回值,Callable类型的任务有返回值但是不能往Thread类里面传,所以引入了Future接口对任务返回结果进行表示。2、Future接口更多的是对异步任务执行结果的抽象,并没有提交给线程执行的相关方法,所以还是不能“往Thread类的构造函数里面扔”,所以又引入了FutureTask类,一个FutureTask类型的任务同时具备提交到线程运行的能力和获取返回结果的能力。原创 2025-04-30 07:59:52 · 838 阅读 · 0 评论 -
并发编程原理与实战(八)详解并发协同利器Semaphore
本文讲解了计数信号量和二进制信号量的概念,并对创建信号量、获取和释放信号量的主要方法,以及公平性的概念进行了讲解,希望通过解读这些方法能加深对Semaphore的理解。原创 2025-05-23 07:59:08 · 812 阅读 · 0 评论 -
并发编程原理与实战(七)详解并发协同利器CyclicBarrier
本文详细讲解了循环屏障CyclicBarrier的主要方法,通过“同时对接口发起多次压测”这个例子,和用CountDownLatch实现对比,说明了循环屏障的使用。原创 2025-05-17 21:29:49 · 1245 阅读 · 0 评论 -
并发编程原理与实战(六)详解并发协同利器CountDownLatch
本文分析了CountDownLatch的的主要方法和使用场景,总结了CountDownLatch的await()方法和Object中的wait()方法的一些区别。原创 2025-05-09 21:24:20 · 748 阅读 · 0 评论 -
并发编程原理与实战(五)经典并发协同方式伪唤醒与加锁失效原理揭秘
本文通过例子详细说明了基于synchronized与wait() notify()实现并发协同时出现的伪唤醒问题,以及列举了几种常见的synchronized加锁失效的问题,希望通过论证这些问题能让大家进一步掌握synchronized与wait() notify()的应用。原创 2025-05-08 21:08:13 · 984 阅读 · 0 评论 -
并发编程原理与实战(四)经典并发协同方式synchronized与wait+notify详解
本文由多线程的概念引出并发协同以及对象监视器锁(synchronized)的概念,在调用wait()和notify()方法前必须先获得对象监视器锁,并讲解了synchronized的使用方法。通过两个线程交替顺序输出数字的经典题目,结合官方说明一步步分析线程如何获得锁,以及wait()和notify()的使用方法。在此我们总结出并发协同的核心思路:弄清楚并发的是什么,什么时候需要协同,谁来等待,谁来唤醒,通过这样的一个分析过程,希望能让大家深刻理解基础的并发协同的方式。原创 2025-05-06 07:26:07 · 1743 阅读 · 0 评论 -
并发编程原理与实战(二)Thread类关键API详解
本文对Thread类的构造函数、主要成员变量、常用成员方法进行了讲解,目的是了解线程具有哪些行为操作,进一步加深对线程的理解。原创 2025-04-28 07:30:25 · 1155 阅读 · 0 评论 -
并发编程原理与实战(一)精准理解线程的创建和停止
本文从官方jdk源码的角度去分析理解创建线程的本质方式和正确停止线程的方式,希望能他大家带来更深刻的理解而不是单纯的死记硬背。原创 2025-04-26 23:41:55 · 1240 阅读 · 1 评论
分享