自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程技术圈

来这一遭,总得留下点啥吧, 努力的折腾吧~~~~

  • 博客(266)
  • 资源 (3)
  • 收藏
  • 关注

原创 【038】面试官直呼内行!SynchronousQueue 竟让线程池性能暴涨 10 倍?90% 的人用错了!

程序员王二的线程池优化案例,生动对比了LinkedBlockingQueue与SynchronousQueue的差异。作者用"快递柜"比喻普通队列的缓存机制,而将SynchronousQueue比作"当面交接"的实时处理模式,强调其零容量、生产消费严格互等的核心特性。针对秒杀等高并发场景,通过改造线程池配置(核心线程数5,最大线程数无界,采用SynchronousQueue),使任务处理耗时从8920ms降至850ms,性能提升10倍。

2025-12-14 12:57:42 529

原创 【037】面试必问!ThreadLocalRandom 和 SecureRandom 选不对,项目直接踩雷!

王二因错误使用ThreadLocalRandom生成支付验证码导致的安全事故案例,深入分析了ThreadLocalRandom与SecureRandom的核心区别。ThreadLocalRandom适用于高并发性能场景但安全性低,而SecureRandom基于系统熵池和密码学算法,安全性高但性能较差(实测生成百万随机数耗时相差50倍)。文章通过"彩票摇号vs超市抽奖"的生动比喻,结合性能测试代码和对比图表 .....

2025-12-14 12:55:22 441

原创 【036】面试被问 ThreadLocalRandom 底层?用奶茶店排队讲透!

ThreadLocalRandom通过线程私有种子实现高效随机数生成,相比ThreadLocal更轻量。其核心在于Thread类中直接存储种子字段(threadLocalRandomSeed等),避免ThreadLocalMap的额外开销。ThreadLocalRandom.current()会检查并初始化线程的种子,返回单例实例但每个线程拥有独立种子。这种设计减少了竞争,提高了性能,适用于高并发场景。通过源码分析可见,ThreadLocalRandom与ThreadLocal......

2025-12-13 10:09:51 719

原创 【035】并发下 Random 卡死?ThreadLocalRandom 让 QPS 翻 10 倍!

Java中ThreadLocalRandom的作用及其在高并发场景下的优势。通过对比Random在多线程环境下的性能问题(如竞争条件和重复订单号),文章以奶茶店取号机的生动比喻,解释了ThreadLocalRandom的核心原理——每个线程拥有独立的随机数生成器,避免了锁竞争。代码示例显示,改用ThreadLocalRandom后,系统QPS提升10倍且消除了重复问题。关键点在于ThreadLocalRandom实现了线程隔离的随机数生成,适合高并发场景。

2025-12-13 10:06:46 587

原创 【034】AQS 高频深度面试题(附接地气详解)- 必背

解析AQS(AbstractQueuedSynchronizer)核心面试考点,通过"门禁系统"等生活化案例,从基础概念到底层实现进行系统讲解。主要内容包括:1)AQS的核心定位是并发同步工具的通用骨架,解决线程排队、阻塞唤醒等通用问题;2)其核心由CLH队列、状态管理state和模板方法三部分组成;3)支持独占锁(如ReentrantLock)和共享锁(如Semaphore)两种模式;4)使用LockSupport实现精准线程控制;5)....

2025-12-12 09:52:48 1112

原创 【033】手写 AQS 版 Semaphore:门禁 “多人通行” 权限怎么实现?

使用JDK的Semaphore控制并发访问,并通过手写AQS版Semaphore深入理解其底层实现。Semaphore基于AQS共享锁机制,通过acquire()获取许可和release()释放许可来控制并发线程数。文章从实际案例出发,演示了Semaphore如何限制接口并发访问,避免资源耗尽。重点剖析了AQS共享锁的核心逻辑,包括tryAcquireShared和tryReleaseShared方法的实现原理。

2025-12-12 09:49:27 986

原创 【032】AQS 的 “手脚”:LockSupport 如何让线程 “听话排队”?

通过门禁系统的类比,解析了LockSupport与AQS的协作机制。当线程排队时,AQS通过LockSupport的park/unpark方法精准控制线程阻塞与唤醒,解决了wait/notify的局限性。关键特性包括:1)许可机制确保一次只唤醒一个线程;2)unpark可先于park执行,避免唤醒延迟问题。AQS的acquire方法源码展示了“抢锁-入队-阻塞”的全流程,而LockSupport的灵活调用正是AQS高效管理线程的核心。通过案例演示,揭示了线程排队和唤醒的底层原理。

2025-12-11 09:05:50 1083

原创 【031】面试被问 AQS 直接懵?王二连说 3 个 “不知道”,哇哥用门禁系统讲透核心!

通过生动的“门禁系统”类比,深入浅出地讲解了AQS(AbstractQueuedSynchronizer)的核心原理。AQS作为并发工具的底层框架,主要由三部分组成:同步状态(volatile state变量)、CLH队列(线程排队区)和条件队列(特殊等待区)。文章详细剖析了AQS的工作流程:获取锁→排队等待→唤醒机制,并对比了ReentrantLock等工具的具体实现。最后通过手写简易独占锁的代码示例,展示了如何基于AQS模板实现自定义锁。

2025-12-11 08:45:32 1283

原创 【030】咋啦? 线程空转 CPU 炸了?王二用 wait/notify 救场,代码抄完直接用!

线程CPU空转了? 怎么办? 万字详解, 让你再也不怕面试遇到这个问题了!!

2025-12-10 10:28:04 854

原创 【029】万字详解: 面试被问活锁和饥饿?王二把死锁当答案被刷,哇哥用食堂打饭讲透,代码直接抄!

通过食堂打饭的生动比喻,清晰区分了并发编程中的死锁、活锁和饥饿问题。重点解析了活锁现象——线程因互相谦让导致无限重试却无法完成任务,并以转账代码为例演示了活锁场景。通过添加随机重试延迟的解决方案,有效打破了线程间的同步谦让。

2025-12-10 10:18:19 1393

原创 【028】面试被问阻塞队列底层?王二支支吾吾被刷,哇哥手撕源码,用 ReentrantLock+Condition 讲透!

阻塞队列底层分析, 面试再也不怕了!!!

2025-12-09 12:55:54 694

原创 【027】阻塞队列玩透了?王二用 SynchronousQueue 优化秒杀系统,QPS 直接翻倍!

通过SynchronousQueue优化秒杀系统性能,实现QPS翻倍。传统使用ArrayBlockingQueue存储订单的方式存在"中转"瓶颈,导致订单处理缓慢。SynchronousQueue无存储特性实现了订单直接传递,生产者必须等待消费者取走订单才能继续,消除了中间堆积,使1000个订单在10秒内处理完成,QPS突破1000。此外还介绍了PriorityBlockingQueue实现VIP订单优先处理的功能,展示了阻塞队列在电商系统中的高级应用。

2025-12-09 12:48:35 952

原创 【026】面试被问阻塞队列?王二写的订单系统丢单,哇哥 1 行代码用 ArrayBlockingQueue 救活!

阻塞队列的快乐与悲伤!

2025-12-08 10:09:08 817

原创 【025】面试被问死锁?王二写的代码锁死服务器,哇哥 3 招根治!

死锁是指多个线程因互相等待对方持有的锁而无法继续执行的情况。常见于并发编程中,如线程A持有锁1等待锁2,线程B持有锁2等待锁1,导致程序卡死。 避免死锁的3种方法: 避免一个线程同时获取多个锁 设置锁获取的超时时间 按固定顺序申请资源(如先获取库存锁再获取余额锁) 通过分析实际案例中的死锁代码,展示了如何通过固定锁获取顺序来解决死锁问题。掌握这些方法可以有效预防并发环境下的死锁问题。

2025-12-08 09:44:37 936

原创 【024】面试被问原子性?别只答 synchronized!3 招根治并发金额错乱

原子操作别拆分:“读 - 改 - 写” 必须捆成一团,不能被线程打断;简单用锁选 sync:新手、简单场景直接上 synchronized,省事儿;复杂场景用 Lock,简单变量用原子,按需选型不盲从。原子性是 Java 并发的 “基础防线”,你踩过的金额错乱、库存超卖坑,本质都是没守住这道防线。记住:单线程看逻辑,多线程看原子性,把关键操作做成 “不可拆分” 的原子操作,并发问题就解决了一大半。

2025-12-07 11:06:31 891

原创 【023】线程池参数配错致任务堆积?哇哥教王二自定义 Executor|Java 并发篇 2

线程池核心参数与自定义线程池实践 本文通过实际案例分析了Java线程池的使用误区与优化方案。案例中FixedThreadPool的无界队列导致任务堆积问题,揭示了预定义线程池的局限性。 核心知识点: ThreadPoolExecutor的7个关键参数:通过"公司团队"比喻生动解释了核心线程数、最大线程数、空闲时间等概念 自定义线程池配置:建议根据业务特点设置合理的线程数和有界队列大小 拒绝策略选择 ....

2025-12-07 09:54:31 713

原创 【022】❓问: Java中的Executor框架及其优点?

Java中Executor框架及其优点分析, 分析new Thread的缺点, Executors快捷创建线程池的方法.

2025-12-07 08:00:00 1047

原创 【021】原子性 + 有序性双杀!彻底解决库存超卖|Java 并发篇 2

本文深入解析Java并发编程中的原子性与有序性问题,通过库存超卖案例揭示JMM两大核心坑。原子性问题源于“读-改-写”操作被线程打断,可通过synchronized加锁或AtomicInteger原子类解决;有序性问题则因JVM指令重排导致单例模式出现“半初始化”对象,需用volatile禁止重排序。文中提供可运行的实证代码与修复方案,涵盖并发计数、懒汉式单例等典型场景,帮助开发者写出线程安全的代码。

2025-12-07 06:00:00 966

原创 【019】⁉️问: Java并发编程中Future和Callable有什么优点?

Java并发编程中使用Future和Callable的优势: 异步执行:Callable封装带返回值的任务,Future获取结果,实现非阻塞调用 结果可控:通过Future.get()精确获取计算结果,避免共享变量线程安全问题 异常透明:执行中的异常会通过Future.get()抛出,排查问题更直观 超时机制:get(timeout, unit)防止线程无限阻塞,提升系统健壮性

2025-12-06 06:30:00 1166

原创 【020】❓ 问: Java中的内存模型以及其对并发编程的影响

Java内存模型(JMM)是并发编程的核心规则,定义了线程如何操作共享变量。其核心问题包括:可见性(线程修改共享变量后其他线程能否立即看到)、原子性(操作是否不可分割)和顺序性(指令执行顺序的保证)。 库存超卖问题的根源是可见性缺陷——线程修改变量后未及时同步到主内存,导致其他线程读取旧值。通过volatile关键字可强制变量修改立即刷新到主内存,解决可见性问题。但volatile无法保证原子性,需结合锁或原子类实现完整线程安全。理解JMM规则是避免并发Bug的关键。

2025-12-06 06:15:00 620

原创 【018】‼️大促系统崩了后,Phaser 教我给动态线程 “按阶段打卡”!

本文介绍了Java并发工具Phaser在处理动态线程分阶段同步任务时的优势。通过一个电商大促场景的案例,对比了传统工具CyclicBarrier和CountDownLatch的局限性:CyclicBarrier线程数固定,CountDownLatch只能使用一次。文章详细讲解了Phaser的核心功能,包括动态注册线程、分阶段同步、线程注销和阶段回调等特性,并通过代码示例展示了如何用Phaser实现灵活的多阶段任务协调。Phaser就像"智能打卡机",能动态调整参与线程数,完美解决了618

2025-12-05 10:53:30 830

原创 【017】❓问: Java并发编程中的Exchanger是什么?

Java并发工具Exchanger解决了线程间数据交换的痛点。传统共享变量+锁的方式存在死锁和数据丢失风险(如订单线程传100笔数据,支付线程仅收到80笔)。Exchanger通过同步点实现精准交换:两个线程调用exchange()时,互相阻塞直至数据交换完成,确保数据一致。其特性包括:仅支持双线程交换、强制类型匹配、支持超时机制。修复后的代码演示了订单与支付线程安全交换List<String>数据,避免漏账问题。该工具类比快递员交接包裹的场景,简化了线程协作逻辑。

2025-12-05 06:30:00 974

原创 【015】Java中如何使用wait()和notify()方法?

Java中的wait()和notify()用于线程间通信,需遵循以下规则: 同步块内使用:必须在synchronized块或方法中调用,否则抛IllegalMonitorStateException。 锁对象一致:wait()和notify()需基于同一对象锁。 锁释放机制:wait()会释放锁,允许其他线程获取;notify()仅唤醒等待线程,不释放锁。 以“外卖催单”场景为例,催单线程通过wait(10000)等待接单线程,若超时则触发催单;

2025-12-04 06:30:00 1361

原创 【016】wait () 和 Condition 的区别

🚀 线程协作优化:Condition精准唤醒替代wait() 摘要 传统wait()/notifyAll()在多条件线程协作中存在"广播式唤醒"问题,导致资源浪费和逻辑混乱。本文通过餐厅点餐系统案例,对比展示了Condition的精准唤醒优势: 问题分析:使用wait()时,堂食和外卖订单共用一个等待队列,导致唤醒不区分订单类型,引发优先级错乱 ....

2025-12-04 06:30:00 996

原创 【14】Java中的Thread.join()方法有什么作用?

Thread.join()是Java多线程编程中的关键方法,用于确保线程执行顺序和数据完整性。其核心作用包括: 等待线程终止:主线程通过join()等待子线程完成,避免数据未计算完就汇总(如报表场景)。 两种用法:无参join()“死等”确保必须完成;带超时join()防止子线程卡死。 典型场景:多线程结果汇总、线程顺序控制、守护线程防提前终止。 与CountDownLatch不同,join()适合少量线程的“一对一”等待,而后者适合多线程“群等”。

2025-12-03 10:58:50 1028

原创 【013】Java中的Semaphore及其主要用途

Semaphore是一种计数信号量,用于控制并发访问资源的数量,避免系统过载。通过acquire()获取许可(无许可时阻塞)和release()释放许可,可有效限制数据库连接、接口请求等资源的并发使用。其核心用途包括接口限流、资源池控制和任务协作,需注意公平模式与非公平模式的选择,并确保许可的正确释放(避免多放或遗忘)。

2025-12-03 10:17:38 1306

原创 【012】什么是CyclicBarrier,它与CountDownLatch有什么区别?

本文通过生动团建案例,对比CyclicBarrier和CountDownLatch的区别。CyclicBarrier是可循环使用的线程同步工具,允许多个线程相互等待至屏障点后继续执行,适用于分批数据处理、游戏加载等场景。与CountDownLatch相比,它具有可重用性、双向等待和可指定触发动作的特点。文章用通俗比喻帮助理解:

2025-12-02 10:57:02 953

原创 【011】Java中的CountDownLatch和它的用途

CountDownLatch是一个线程同步辅助类,用于让主线程等待一组子线程完成工作。其核心机制是通过计数器实现:初始化时设定线程数,子线程完成任务后调用countDown()减少计数,主线程通过await()阻塞直到计数器归零。典型应用场景包括系统初始化等待多模块加载、压测统计准确计时等。

2025-12-02 10:16:03 1029

原创 【051】Dubbo3从0到1系列之HeaderExchanger

HeaderExchanger是Dubbo框架中实现消息交换的核心组件,通过装饰器模式封装底层网络连接,提供基于头部信息的通信机制。其主要功能包括创建支持消息头的ExchangeClient和服务端ExchangeServer,采用多层处理器结构(HeaderExchangeHandler、DecodeHandler)处理协议解析与请求响应。该组件支持端口统一服务,实现了灵活的消息交换能力,为系统提供了良好的可扩展性和维护性基础。

2025-12-01 07:45:00 817

原创 【010】Java中的ThreadLocal变量及其使用场景

ThreadLocal通过为每个线程提供独立变量副本,解决多线程数据共享问题。文中以支付系统故障为例,静态变量导致用户数据错乱,改用ThreadLocal后实现线程隔离,确保数据安全。ThreadLocal适用于用户会话、数据库连接等场景,但需注意内存泄漏风险,务必在finally中调用remove()。相比synchronized的排队机制,ThreadLocal通过数据隔离避免竞争,提升性能。

2025-12-01 07:00:00 1297

原创 【050】Dubbo3从0到1系列之HeaderExchangeServer

HeaderExchangeServer是Apache Dubbo服务端通信的核心实现类,作为RemotingServer的装饰器,封装底层服务器并提供统一接口。其核心功能包括连接管理、空闲检测(通过HashedWheelTimer定时关闭空闲连接)和优雅关闭机制(支持超时控制与只读事件通知)。通过AtomicBoolean确保线程安全关闭,利用URL参数实现灵活配置,并为每个Channel创建对应的HeaderExchangeChannel进行统一管理。该组件通过资源复用、异常处理和请求平滑过渡等

2025-11-30 08:30:00 1029

原创 【009】Java中线程池的作用是什么

Java线程池通过资源复用、并发控制和任务管理三大机制提升程序效率。核心作用包括:1)复用预创建线程,减少创建销毁开销;2)限制最大线程数,避免资源耗尽;3)任务队列缓冲实现削峰填谷;4)预创建线程提高响应速度。其效率本质是减少线程创建/销毁的"无用功"和CPU上下文切换的"内耗",通过常驻核心线程、智能任务调度和资源管控,让系统资源聚焦于任务执行。实际开发中需根据任务类型(计算密集型/IO密集型)动态调整线程数,在并发性能和资源消耗间取得平衡 ....

2025-11-30 08:00:00 1200

原创 【049】Dubbo3从0到1系列之HeaderExchangeClient

HeaderExchangeClient是Dubbo框架中实现ExchangeClient接口的核心组件,负责客户端通信管理。它通过封装底层Client对象,提供统一的请求/响应交互能力,并集成心跳检测(HeartbeatTimerTask)和自动重连机制(ReconnectTimerTask)。核心功能包括:基于HeaderExchangeChannel的消息交换、连接状态维护(通过isConnected()检测活跃性)、以及资源清理(关闭时取消定时任务)。

2025-11-29 11:29:24 683

原创 【008】Java程序中正确地停止一个线程?

Java线程停止的正确方法应遵循协作式原则,避免使用废弃的暴力方法(如stop()、suspend())。推荐4种优雅停止方式: 协作式中断:通过interrupt()设置中断标志,线程主动检查isInterrupted()并安全退出(需处理InterruptedException)。 自定义标志位:使用volatile boolean变量控制线程终止,确保可见性。 避免阻塞场景:注意线程在阻塞方法(如sleep())中的中断处理。

2025-11-29 09:41:57 855

原创 【048】Dubbo3从0到1系列之HeaderExchangeChannel

HeaderExchangeChannel是Dubbo中实现ExchangeChannel接口的核心组件,基于头部机制处理请求-响应交换。它作为Channel的装饰器,提供send()和request()方法,支持同步/异步通信。核心功能包括:1)通过DefaultFuture管理异步请求,实现超时检测和响应处理;2)支持自定义执行器和超时时间;3)完善的资源管理和异常处理机制.

2025-11-28 10:31:52 962

原创 【007】Java中synchronized和ReentrantLock有什么区别?

synchronized和ReentrantLock区别详解

2025-11-28 10:23:14 810

原创 【047】Dubbo3从0到1系列之ExchangeChannel

ExchangeChannel是Dubbo框架中扩展Channel接口的通信通道,提供了异步请求处理能力。核心方法包括四种request()重载,支持自定义超时时间和线程池执行器,均返回CompletableFuture实现异步通信。该接口具有异步非阻塞、灵活扩展的特点,适用于服务调用、心跳检测等双向通信场景,通过ExchangeHandler处理请求响应,并支持优雅关闭通道。设计上保留了旧方法但标记废弃,体现了框架的演进兼容性。

2025-11-27 15:28:11 738

原创 【006】Java内存模型中的happens-before原则是什么?

ava内存模型中的happens-before原则是确保多线程环境下内存可见性和有序性的核心机制。该原则定义了操作间的偏序关系,强调操作A的结果必须对操作B可见,而非单纯的时间先后顺序。通过8大规则(如程序顺序、volatile变量、监视器锁等),happens-before在允许编译器/CPU优化(指令重排序)的同时,保证多线程安全。典型应用包括volatile变量的写读操作、synchronized同步块等。

2025-11-27 15:21:28 980

原创 【046】Dubbo3从0到1系列之Exchanges核心接口Request、Response

本文介绍了Dubbo框架中Exchange层的核心组件Request和Response类。Request类封装远程调用请求,包含唯一ID、版本号、通信模式等字段,采用线程安全的ID生成机制,支持事件处理和容错设计。Response类对应Request,包含状态码、结果数据和错误信息,定义了完善的响应状态体系。两者通过ID匹配实现请求-响应机制,支持同步转异步的交互模式,构成Dubbo信息交换层的核心基础。

2025-11-26 12:56:43 999

原创 【005】万字长文: 什么是线程池?在Java中如何使用线程池?

线程池是一种复用线程、降低资源开销的并发工具。Java中通过Executor框架实现,推荐使用ThreadPoolExecutor手动创建(可灵活配置核心线程数、队列和拒绝策略),而非Executors工具类(存在OOM风险)。线程池核心思想是复用线程,避免频繁创建销毁,提高响应速度并便于管理。使用时需提交Runnable/Callable任务,并注意合理关闭线程池。

2025-11-26 11:24:10 1792

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除