
多线程
文章平均质量分 92
程序员徐述
公号:程序员徐述
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[Java并发与多线程]
Java多线程目录第一章 基本概念第二章 synchronized关键字第三章 线程等待与唤醒day day up!原创 2019-08-03 20:51:43 · 398 阅读 · 0 评论 -
线上 TraceId 集体失踪,大促排查如何破局?
并发工具极大提升了并发代码编写的效率,也预先为潜在问题备好高效解法,是开发过程中的得力助手。但开发人员不能仅满足于表面应用,务必深入剖析其实现逻辑,明晰不同场景下的适用规则。若对并发工具一知半解、盲目套用,不仅难以发挥其最大效能,面对复杂问题时会陷入被动,更可能在生产环境中引发严重线上故障。所以 J.U.C 虽好,可不要贪杯哦!最后,我最近弄了一个Java技术交流群,讨论面试、后端等领域知识,如果你感兴趣,欢迎关注我公众号回复【1】,我拉你入群哈~(我的公众号:程序员徐述)原创 2025-03-10 09:00:00 · 836 阅读 · 0 评论 -
重生之我在操作系统当线程
作为操作系统的最小调度单元,我的一生是资源争夺与秩序构建的缩影。“每一次上下文切换,都是效率与公平的权衡;每一把锁的争夺,都是安全与性能的博弈;每一次内存访问,都是速度与一致性的较量。从诞生到消亡,我在并发的洪流中挣扎求生,也在混沌的世界中寻找秩序。线程的世界,正如人类社会一般复杂而微妙,唯有不断学习与进化,才能在这场永不停息的竞争中立于不败之地。作者:徐述公众号:程序员徐述关注我,一起探索程序员的奇妙世界!原创 2025-03-07 09:00:00 · 582 阅读 · 0 评论 -
一行CompletableFuture代码引发的P0级事故!
这次事故,源于一段暗藏风险的代码。高并发下,默认线程池不堪重负,引发连锁反应,致使系统瘫痪。线程池配置失当:直接沿用默认参数,未结合业务负载、服务器性能调校,高并发场景易过载。异常处理缺位:捕获异常后不记录、不上报,还遗漏异步任务异常捕获,问题排查困难。并发安全失控:共享变量操作未加锁,使用非线程安全集合类,高并发下数据错乱。任务依赖混乱:不规划任务启动顺序,也不考虑依赖失败策略,一处出错就全盘皆输。线上无小事,生产环境中要注意:默认配置是魔鬼,高并发下没有侥幸!原创 2025-03-02 22:24:44 · 743 阅读 · 0 评论 -
并发工具类库加持,线程安全真的万无一失?
综上,希望今天这篇文章对你帮助!原创 2025-02-27 09:00:00 · 915 阅读 · 0 评论 -
美团面试题:线上线程池的参数,到底如何设置?
我监控:实时采集线程池的运行状态。策略:根据监控数据定义调整策略。调优:结合压测和调优,找到最佳参数组合。自动化:实现自动化调整,提高响应速度。面试官(点头):不错,思路很清晰,看来你对这个问题理解得挺透彻。准备明天就来入职吧。最后,我最近弄了一个Java技术交流群,讨论面试、后端等领域知识,如果你感兴趣,加我微信备注加群,我拉你入群哈~(我的微信号:shawne11)目前已经有近 100 人加入。如果你已经在群里,请忽略~综上,希望今天这篇文章对你帮助!原创 2025-02-23 22:06:43 · 898 阅读 · 0 评论 -
面试被问线程两次 start,我直接尬住了
通过前面的分析,相信大家已经明白了:start() 方法只能调用一次。如果尝试调用两次,程序会抛出 IllegalThreadStateException 异常。这是因为线程的生命周期是单向的,从创建(NEW)到运行(RUNNABLE),再到终止(TERMINATED)。一旦线程开始执行,它的状态会逐步推进,最终结束,无法回退。如果你觉得这篇文章对你有帮助,欢迎关注我的公众号【程序员徐述】,回复“666”,获取更多关于面试题汇总。希望大家都能在技术道路上越走越远,面试顺利!原创 2025-02-20 22:50:42 · 306 阅读 · 0 评论 -
面试必考题:核心线程不被回收,你真的会答吗?
核心线程的“保命”机制默认情况下,allowCoreThreadTimeOut 为 false,核心线程的 timed 为 false。核心线程会调用 workQueue.take(),一直阻塞等待任务,而不会被回收。核心线程的回收条件如果显式设置 allowCoreThreadTimeOut 为 true,核心线程会调用 workQueue.poll,在超时后退出。另外,如果线程池关闭,核心线程也会退出。死循环的作用:让线程持续获取任务,并动态响应线程池状态变化。原创 2025-02-19 22:02:48 · 720 阅读 · 0 评论 -
面试必考题:线程池创建后,里面到底有没有线程?
问:线程池创建后,里面到底有没有线程?线程池创建时,内部并没有线程。线程是按需创建的,只有在任务提交时才会根据核心线程数、任务队列和最大线程数的配置来创建线程。问:如何让线程池创建后就有线程?如果希望线程池创建后就有线程,可以使用或预热核心线程。线程池的设计非常精妙,理解其背后的原理,才能更好地使用它。希望这篇文章能帮你彻底搞懂线程池的初始化过程,下次面试再遇到这个问题,就可以自信地回答了!如果你觉得这篇文章对你有帮助,欢迎关注我的公众号【程序员徐述】,回复“666”,获取更多关于面试题汇总。原创 2025-02-15 17:33:38 · 296 阅读 · 0 评论 -
线程池创建陷阱:为什么阿里禁止使用Executors?
Executors 的工厂方法虽然方便,但隐藏了线程池的核心参数和配置,容易导致资源耗尽、拒绝策略不灵活、难以监控和调优等问题。相比之下,直接使用 ThreadPoolExecutor 构造函数创建线程池,可以更精细地控制线程池的行为,更好地适应实际业务需求。原创 2025-02-12 21:51:33 · 965 阅读 · 0 评论 -
深入分析线程安全问题的本质
线程安全问题指的是当多个线程同时访问共享资源时,程序无法按预期正常执行,导致数据不一致。原子性问题:多个线程同时访问共享变量时,可能会中断或交叉执行,导致不正确的结果。可见性问题:一个线程对共享变量的修改,其他线程可能看不到,造成数据不一致。重排序问题:由于编译器、JVM或处理器优化,导致代码执行顺序不一致,产生错误的结果。下面我们具体分析下。原子性问题:操作被拆分成多个步骤,多个线程同时执行时,操作可能会中断或交叉执行,导致数据错误。可见性问题:源于缓存导致的不同线程工作内存与主内存不一致;原创 2025-01-09 21:05:14 · 800 阅读 · 0 评论 -
Java程序死锁问题定位与解决
一定是发生在并发中;互不相让:当两个(或更多)线程(或进程)相互持有对方所要的资源,又不主动释放,导致程序陷入无尽的阻塞,这就是死锁。死锁特点:两个或多个线程(进程)相互等待对方释放资源,导致所有线程都无法继续执行。解决方法:避免一个线程持有多个资源的情况,或使用超时机制,如果一个线程在一定时间内没能获得锁,就放弃等待。活锁特点:线程仍然在运行,但由于不断地响应对方,始终没有实际进展。解决方法:为避免活锁,可以设置超时机制,或者使用协调机制来避免线程之间过度的反应。饥饿。原创 2024-11-26 19:57:06 · 1140 阅读 · 0 评论 -
Java 并发之 AQS 详解(下)
Java 并发之 AQS 详解原创 2022-09-04 20:56:07 · 553 阅读 · 0 评论 -
Java 并发之 AQS 详解(上)
Java 并发之 AQS 详解原创 2022-09-04 19:58:07 · 695 阅读 · 0 评论 -
Java 线程池实现原理及实战
ThreadPoolExecutor万字详解原创 2022-08-07 17:45:23 · 840 阅读 · 0 评论 -
[Java并发与多线程](一)基本概念
1、进程与线程的关系进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)2、多线程的实现多进程是指操作系统能同时运行多个任务(程序)。多线程是指在同一程序中有多个顺序流在执行。在...原创 2019-03-13 17:40:02 · 513 阅读 · 0 评论 -
[Java并发与多线程](二)synchronized关键字
Java多线程之基本概念1、synchronized原理2、synchronized基本规则1、synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj”这个对象的同步锁。不同线程对同步锁的访问是互斥的。也就是...原创 2019-07-31 20:27:56 · 373 阅读 · 0 评论 -
[Java并发与多线程](三)让线程停下来
Java多线程之interrupt方法和线程终止方式1、interrupt()说明2、终止线程的方式2.1、终止处于“阻塞状态”的线程2.2、终止处于“运行状态”的线程3、终止线程的示例4、interrupted() 和 isInterrupted()的区别1、interrupt()说明在介绍终止线程的方式之前,有必要先对interrupt()进行了解。关于interrupt(),java的...原创 2019-08-03 22:26:24 · 464 阅读 · 0 评论 -
[Java并发与多线程](四)线程优先级和守护线程线程终止方式
Java多线程之线程优先级和守护线程1、interrupt()说明2、线程优先级的示例3、守护线程的示例1、interrupt()说明java 中的线程优先级的范围是1~10,默认的优先级是5。高优先级线程会优先于低优先级线程执行。java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是用户线程;否则就是守护线程。用户线程一...转载 2019-08-05 20:17:37 · 323 阅读 · 1 评论 -
[Java并发与多线程](五)Thread类和Object类中的重要方法详解
Java多线程之线程等待与唤醒1、wait(),notify(),notifyAll()等方法介绍2、wait()和notify()示例3、wait(long timeout)和notify()4、wait(long timeout)和notify()5、为什么notify(),wait()等函数定义在Object中,而不是Thread中1、wait(),notify(),notifyAll()...转载 2019-08-03 20:25:11 · 513 阅读 · 0 评论 -
[Java并发与多线程](六)线程休眠
Java多线程之线程休眠1、sleep()介绍2、sleep()示例3、sleep() 与 wait()的比较1、sleep()介绍sleep() 定义在Thread.java中。sleep()的作用是让当前线程休眠,即当前线程会从运行状态进入到休眠(阻塞)状态。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠的时间;在现场重新被唤醒时,它会由阻塞状态变成就绪状态,从而等待cp...转载 2019-08-03 21:44:53 · 414 阅读 · 0 评论 -
[Java并发与多线程](七)join方法
Java多线程之join1、join()介绍2、join()源码分析(基于JDK1.8.0_191)3、join()示例1、join()介绍join() 定义在Thread.java中。join() 的作用:让主线程等待子线程结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解:// 主线程public class Father extends Thread { pu...转载 2019-08-03 22:03:00 · 246 阅读 · 0 评论 -
[Java并发与多线程](八)线程让步
Java多线程之线程让步1、yield()介绍2、yield()示例3、yield() 与 wait()的比较1、yield()介绍yield()的作用是让步。它能然当前线程由运行状态进入到就绪状态,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到运行状态继续执行!2、yie...转载 2019-08-03 21:19:33 · 276 阅读 · 0 评论 -
[Java并发与多线程](久)生产消费者问题
生产消费者问题线程1、生产/消费者模型2、生产/消费者实现1、生产/消费者模型生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括生产者、消费者、仓库和产品。他们之间的关系如下:生产者仅仅在仓储未满时候生产,仓满则停止生产。消费者仅仅在仓库有产品时候才能消费,仓空则等待。当消费者发现仓库没产品可消费时候会通知生产者生产。生产者在生产出可消费产品时候,应该通知等待的消费者去消费。...转载 2019-08-05 20:25:01 · 323 阅读 · 0 评论 -
[Java并发与多线程](十)线程安全问题
Java多线程之线程安全问题1、线程安全1.1、什么是线程安全?1.2、什么情况下会出现线程安全问题,怎么避免?1.3、一共有哪几类线程安全问题?1.3.1、运行结果错误1.3.2、活跃性问题1.3.3、对象发布和初始化的时候的安全问题2、哪些场景需要额外注意线程安全问题?3、为什么多线程会带来性能问题?1、线程安全1.1、什么是线程安全?当多个线程访问一个对象时如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行文都可以获原创 2020-12-27 22:10:06 · 587 阅读 · 0 评论 -
[Java并发与多线程](十一)Java内存模型——底层原理
Java内存模型——底层原理1、底层原理2、三兄弟:JVM内存结构 VS Java内存模型 VS Java对象模型2.1、JVM内存结构:和Java虚拟机的运行时区域有关2.2、Java内存模型-JMM(*):和Java并发编程有关2.3、Java对象模型:和Java对象在虚拟机中的表现形式有关3、JMM是什么?3.1、什么是重排序?3.2、重排序的好处:提高处理速度3.3、 重排序的3种情况:编译器优化、CPU指令重排、内存的"重排序"3.4、可见性3.4.1、为什么会有可见性问题?3.4.2、JMM的抽原创 2020-12-28 22:21:45 · 367 阅读 · 0 评论 -
[Java并发与多线程](十二)死锁——从产生到消除
Java内存模型——底层原理1、死锁是什么?有什么危害?1.1、死锁的影响1.2、发生死锁的例子(*)1.3、实际生产中的例子-转账1.4、死锁发生的4个必要条件1.5、如何定位死锁2、修复死锁的策略2.1、线上发生死锁应该怎么办?2.2、常见修复策略2.2.1、哲学家就餐的换手方案2.2.2、死锁的检测与恢复策略2.2.3、实际工程中如何有效避免死锁3、其他活性故障3.1、活锁(LiveLock)3.2.1、工程中的活锁实例:消息队列3.2.2、如何解决活锁问题3.2、饥饿1、死锁是什么?有什么危害?原创 2020-12-29 21:15:01 · 450 阅读 · 0 评论 -
[Java并发与多线程](十三)线程池原理
线程池——治理线程的最大法宝1、线程池的自我介绍1、线程池的自我介绍原创 2021-01-04 23:39:38 · 349 阅读 · 0 评论 -
[Java并发与多线程](十四)线程池源码(上)
线程池源码1、ThreadPoolExecutor的工作状态1.1 工作状态概述1.2 分析一下线程池状态的标记原理1.3 工作状态的具体判定1.4 工作状态的转换2、ThreadPoolExecutor的重要成员变量2.1 构造方法2.2 线程工厂(ThreadFactory)2.3 拒绝策略(RejectedExecutionHandler)2.4 其他重要成员变量3、盘点一下常见的线程池3.1、FixedThreadPool3.2、SingleThreadPool3.3、CachedThreadPoo转载 2021-01-13 23:05:06 · 197 阅读 · 0 评论 -
[Java并发与多线程](十五)线程池源码(下)
线程池源码1、内部类-Worker1.1 基本属性1.2 构造方法1.3 对AQS相关方法的实现1.4 对线程的中断方法2、提交任务2.1、创建工作线程1、内部类-Worker1.1 基本属性重要的是thread(当前worker线程),firstTask(初始任务),completedTasks(任务计数器)。private final class Worker extends AbstractQueuedSynchronizer implements Runnab转载 2021-01-13 23:44:55 · 204 阅读 · 0 评论 -
[Java并发与多线程](十六)ThreadLocal
线程池——治理线程的最大法宝1、ThreadLocal1.1 两大使用场景——ThreadLocal的用途1.1 典型场景1:每个线程需要一个独享的对象1.2 典型场景2:每个线程内需要保存全局变量1.2 ThreadLocal方法1.3 ThreadLocal的两个作用1.4 使用ThreadLocal带来的好处1.5 ThreadLocal原理1.6 ThreadLocal主要方法介绍2、ThreadLocal注意点2.1 内存泄露2.2 如何避免内存泄露2.3 空指针异常2.4 共享对象1、Thre原创 2021-01-06 23:11:35 · 258 阅读 · 0 评论 -
[Java并发与多线程](十七)不可不说的“锁”事
线程池——治理线程的最大法宝1、Lock接口1.1 简介、地位、作用1.2 为什么synchronized不够用?为什么需要Lock?1.3 方法介绍1.3.1 lock()1.3.2 tryLock()1.3.3 tryLock(long time, TimeUnit unit)1.3.4 lockInterruptibly1.3.5 unlock()1.4 可见性保证2、锁的分类2.1 乐观锁和悲观锁(*)2.1.1 为什么会诞生非互斥同步锁(乐观锁)?—互斥同步锁(悲观锁)的劣势2.1.2 什么是乐观原创 2021-01-07 23:11:06 · 302 阅读 · 0 评论 -
[Java并发与多线程](十八)atomic包
atomic包【一刻也不能分割】1、什么是原子类,有什么作用?2、Atomic*基本类型原子类2.1 AtomicInteger:原子类3 Atomic*Array数组类型原子类4 Atomic*Reference引用类型原子类5、把普通变量升级为原子类,用AtomicIntegerFieldUpdater升级原有变量6、Adder累加器(*)6.1、代码演示6.2、LongAdder带来的改进和原理6.3、对比AtomicLong和LongAdder7、Accumulator累加器1、什么是原子类,有什原创 2021-01-09 20:11:15 · 343 阅读 · 0 评论 -
[Java并发与多线程](十九)CAS原理
CAS原理1、什么是CAS1.1、CAS的等价代码2、案例演示3、应用场景3.1、分析在Java中是如何利用CAS实现原子操作的?4、以AtomicInteger为例,分析在Java中是如何利用CAS实现原子操作的?4.1 getAndAdd方法4.2 Unsafe类4.3 AtomicInteger加载Unsafe工具,用来直接操作内存数据4.4 接下来继续看Unsafe的getAndAddInt方法的实现5、缺点1、什么是CAS先比较后操作,运用的场合一定是并发的,是一种思想,一种算法,用来实现线程原创 2021-01-09 20:20:49 · 341 阅读 · 0 评论 -
[Java并发与多线程](二十)以不变应万变:final关键字和不变性
以不变应万变:final关键字和不变性1、什么是不变性(Immutable)2、final的作用2.1、final3种用法:修饰变量、方法、类2.1.1 final修饰变量——三种变量2.1.2 final修饰方法2.1.3 final修饰类2.2 注意点3、不变性和final的关系4、把变量写在线程内部——栈封闭5、常见问题:真假美猴王1、什么是不变性(Immutable)如果对象在被创建后,状态就不能被修改,那么它就是不可变的;例子:person对象,age和name都不能在变;好处:具有不变性原创 2021-01-09 20:37:10 · 281 阅读 · 0 评论 -
[Java并发与多线程](二十一)并发容器
并发容器1、并发容器概览1.1、趣说集合类的历史————古老和过时的同步容器2、ConcurrentHashMap(*)2.1、磨刀不误砍柴工:Map简介2.2、为什么需要ConcurrentHashMap?2.3、九层之台,起于累土,罗马不是一天建成的:HashMap的分析2.4、JDK1.7的ConcurrentHashMap实现和分析2.5、JDK1.8的ConcurrentHashMap实现和分析2.6、对比JDK1.7和1.8的优缺点,为什么要把1.7的结构改成1.8的结构2.7 组合操作:Con原创 2021-01-09 21:10:13 · 331 阅读 · 0 评论 -
[Java并发与多线程](二十二)控制并发流程
控制并发流程1、什么是控制并发流程2、CountDownLatch到计时门闩2.1、CountDownLatch类的作用2.2、类的主要方法介绍2.3、两个典型用法3、Semaphore信号量3.1、信号量用法3.2、信号量代码演示3.2、信号量的特殊用法4、Condition接口(又称条件对象)4.1 代码演示4.1.1 普通示例4.1.2 用Condition实现生产者消费者模式5、CyclicBarrier循环栅栏5.1、可重用5.2、CyclicBarrier和CountDownLatch的区别1原创 2021-01-09 21:25:00 · 330 阅读 · 0 评论 -
[Java并发与多线程](二十一)AQS
AQS1、为什么需要AQS——AbstractQueuedSynchronizer2、AQS的比喻3、AQS的作用、重要性,地位4、AQS内部原理解析-AQS的三要素(*)5、应用实例、源码解析5.1、AQS在CountDownLatch的应用5.2、AQS在Semaphore的应用5.3、AQS在ReentrantLock的应用6、利用AQS实现一个自己的Latch门闩1、为什么需要AQS——AbstractQueuedSynchronizer1)、锁和协作类的共同点:闸门,ReentrantLock原创 2021-01-09 21:35:19 · 318 阅读 · 0 评论 -
[Java并发与多线程](二十一)获取子线程的执行结果(*)【来而不往非礼也】
Future和Callable——治理线程的第二大法宝1、Runnable的缺陷2、Callable接口3、Future类3.1、Future的主要方法:5个3.2、Future用法3.2.1 用法1:线程池的submit方法返回Future对象3.2.1.1 get的基本用法3.2.1.2 Callable的Lambda表达式形式3.2.1.3 多个任务,用Future数组来获取结果3.2.1.4 任务执行过程中抛出Exception和isDone展示3.2.1.5 获取任务超时3.2.2 用法2:用Fu原创 2021-01-09 21:47:24 · 677 阅读 · 0 评论 -
[Java并发与多线程](二十二)从0到1打造高性能缓存
从0到1打造高性能缓存1、从最简单版缓存入手——HashMap2、代码有重构空间——用装饰者模式3、性能待优化——引出锁性能优化经验:缩小锁的粒度4、用并发集合——ConcurrentHashMap5、避免重复计算——Future和Callable的妙用6、依然存在重复的可能——用原子操作putIfAbsent7、计算中抛出异常——ExecutionException8、缓存污染——计算失败则移除Future,增加健壮性9、缓存过期功能10、高并发访问时11、测试并发性能,所有线程同时访问缓存1、从最简单原创 2021-01-09 21:59:13 · 290 阅读 · 0 评论