
多线程
文章平均质量分 89
爱叨叨的程序狗
码农,不只Coding.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
自动挡线程池OOM最佳实践
配置完成后可启动SpringBoot项目调用接口等待OOM,待项目发出OOM错误后,可以去配置的路径下查找dump文件,一般以hprof为后缀,打开IDEA中的Profiler,将文件拖入Profiler即可,需要注意的是不同版本IDEA操作可能略有不同,可自行百度操作方式也可参考IDEA官网给出的操作教程。打开dump文件后可以看到程序在出现OOM错误时的资源占用情况,我们分配的最大堆内存是512MB,分析dump文件可以发现。占用了516MB的内存,并且频繁触发GC Root,我们查看。原创 2025-04-07 20:12:16 · 589 阅读 · 0 评论 -
Best practice-生产环境中加锁的最佳实践
场景:图书馆有两个相邻的储物柜(柜子A和柜子B),小明和小红需要同时使用这两个柜子才能完成借书流程。互斥资源每个柜子只有一把钥匙,且一次只能被一人使用(资源不可共享)。持有并等待小明拿到了柜子A的钥匙,但他说:“我要等小红用完柜子B的钥匙,才能继续操作。小红拿到了柜子B的钥匙,但她说:“我要等小明用完柜子A的钥匙,才能继续操作。僵局形成两人都死死攥着已有的钥匙,同时等待对方手里的另一把钥匙。结果两人卡在原地,谁也无法完成借书流程。死锁的定义。原创 2025-03-06 20:52:54 · 847 阅读 · 0 评论 -
通过ConcurrentHashMap带你了解并发中的原子性与竟态条件
上文中我们讲到原子性是同时成功,要么同时失败,非原子性操作时,会出现多个线程同时修改共享数据的情况,正如上文举例中往篮子里放橘子一样,篮子里的橘子就是共享数据,线程A和线程B同时会向篮子里放橘子,线程A(小明)和线程B(小红)同时往篮子里的放橘子,两人放完橘子后发现篮子里无法容纳这么多橘子,形成了数据竞争。多个线程同时修改共享数据时,如果不加控制,会出现数据竞争,导致意外结果。Thread A 读取 oranges = 8Thread B 读取 oranges = 8。原创 2025-02-16 10:47:12 · 620 阅读 · 0 评论 -
Best practice-ThreadLocal高并发场景的最佳实践
个人理解:该类提供了一个线程级别的变量,不同线程间通过get/set方法可以访问到自己不同的数据副本,ThreadLocal实例通常是类中的私有的静态数据如userId或事务id。类型所创建,key是线程信息,value值是数据的副本,其副本值在各个线程间不可见,在并发模式下各个线程会访问到自己对应副本的数据信息。副本变量值没有被清空,当线程池中的线程被复用时,该线程就会获取到历史请求获取到的副本变量。的线程池中的线程是可以复用的,假设线程id为1的线程在代码执行完毕后,对应的。原创 2025-02-10 19:52:12 · 709 阅读 · 0 评论 -
Thread的stop和interrupt的区别
方法会导致线程突然终止,可能导致如:线程持有的资源没有被正确释放,使得程序状态不一致问题。因此建议使用更安全的方式来停止线程,比如使用。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。🏆在掘金、优快云、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。因为本质上它是不安全的,使用该方法可能会导致数据、资源不一致的问题,👋🏻你好,我是Debug.c。📞如果您对我感兴趣,请联系我。原创 2024-06-01 10:31:07 · 321 阅读 · 0 评论 -
通俗易懂讲乐观锁与悲观锁
假设线程1要使用乐观锁对id为1的数据做修改,在修改前,需要先查询数据数据版本,然后再执行其他逻辑,在执行其他逻辑的期间,该数据可能被其他线程所修改,在下边的案例中修改了对应的数据,此时线程1并不知道其他线程修改了数据,为了判断数据是否被修改,线程1在更新时在where条件中校验数据版本,如果数据被修改过,则version版本不可能为1,因此,可以通过update语句的影响行数判断数据是否被修改。悲观锁在使用时都会把公共资源进行加锁,其他线程处于阻塞状态,性能相较于乐观锁较低,综合以上,原创 2024-06-01 10:30:27 · 934 阅读 · 0 评论 -
通俗易懂讲乐观锁与悲观锁
假设线程1要使用乐观锁对id为1的数据做修改,在修改前,需要先查询数据数据版本,然后再执行其他逻辑,在执行其他逻辑的期间,该数据可能被其他线程所修改,在下边的案例中修改了对应的数据,此时线程1并不知道其他线程修改了数据,为了判断数据是否被修改,线程1在更新时在where条件中校验数据版本,如果数据被修改过,则version版本不可能为1,因此,可以通过update语句的影响行数判断数据是否被修改。悲观锁在使用时都会把公共资源进行加锁,其他线程处于阻塞状态,性能相较于乐观锁较低,综合以上,原创 2024-05-15 22:53:49 · 891 阅读 · 0 评论 -
深入了解ThreadLocal:避免内存泄漏的陷阱与最佳实践
在深入讨论的内存泄漏问题之前,我们先来了解一下的基本概念。是Java中的一个工具类,提供了一种线程级别的数据隔离机制。通过,我们可以在每个线程中存储自己的数据副本,互不影响,从而简化了多线程编程中的共享数据问题。是一个强大的工具,能够在多线程环境中解决共享数据的问题。然而,开发者在使用时应当小心,特别是在长时间存在的线程和线程池等场景下,要注意及时清理,以避免内存泄漏的发生。通过正确的使用习惯和最佳实践,可以更好地发挥的优势,确保多线程环境下的数据安全和性能。原创 2023-12-12 15:37:12 · 1082 阅读 · 0 评论 -
深入解析ThreadPoolTaskExecutor的阻塞队列技术选型
是Spring框架中强大的线程池实现,通过合理选择阻塞队列类型,我们可以更好地满足应用程序的需求,提高性能和稳定性。在实际应用中,根据具体场景调整线程池配置,选择适当的阻塞队列,将有助于构建出更为健壮和高效的多线程应用。希望本文对您理解的阻塞队列提供了一些有价值的信息。如果您有任何问题或建议,请随时在评论中分享。原创 2023-12-06 09:54:18 · 1032 阅读 · 0 评论 -
深度解析CompletableFuture:Java 异步世界的奇迹
是 Java 8 引入用于支持异步编程和非阻塞操作的类。对于没有使用过通过它这么长的名字就感觉到一头雾水,那么现在我们来一起解读一下它的名字。Completable:可完成Future:未来/将来这两个单词体现了它设计的目的:提供一种可完成的异步计算。result:存储异步计算的结果stack:存储观察者链NEXT:异步调用链中观察者链的管理这三个变量用于Completion类中tryFire方法的标志,表示不同的触发模式。SYNC。原创 2023-11-12 16:25:41 · 288 阅读 · 0 评论 -
优雅的并发编程-CompletableFuture
以上是接口串行执行的逻辑,当前服务器环境一般都是多核心、多线程,服务器可以同时处理多个任务,如果此时还使用单线程去执行,有些“暴殄天物”,并且接口响应速度会比较慢,那么优化的方式就是开启多个线程去分别执行不同的逻辑,那么我们可以使用。单线程和多线程相比,举个不恰当的例子:当你为了报仇,踌躇满志上山叩拜师门,经过十年寒窗苦练、不舍昼夜的练习,终于学成归来下山复仇,结果仇家拿出AK 47一阵突突,云淡风轻的跟你说:“大人,时代变了”的无力感。原创 2023-11-08 21:36:39 · 552 阅读 · 0 评论 -
使用 CountDownLatch 实现多线程协作
在多线程编程中,经常需要实现一种机制来协调多个线程的执行,以确保某些操作在所有线程完成后再进行。CountDownLatch 就是 Java 并发包中提供的一种同步工具,它能够让一个或多个线程等待其他线程完成操作。CountDownLatch 和 CompletableFuture 都是 Java 中用于多线程协作的工具,它们各自适用于不同的场景。CountDownLatch 更适合简单的多线程协作,而 CompletableFuture 则更适合复杂的异步编程场景。原创 2023-11-07 10:46:07 · 232 阅读 · 0 评论 -
共生与共享:线程与进程的关系
在计算机科学和操作系统领域,线程(Thread)和进程(Process)是两个关键概念。它们之间存在密切的关系,但又有着明显的区别。本文将深入探讨线程和进程之间的关系,以及它们在并发编程和资源管理中的作用。进程是操作系统中的基本执行单元,它是一个正在运行的程序的实例。每个进程都有自己的独立内存空间、数据和执行环境。进程之间相互隔离,一个进程的崩溃通常不会影响其他进程的正常运行。进程提供了更高级别的隔离,使得不同进程可以独立运行,互不干扰。线程是进程内的执行单元,一个进程可以包含多个线程。原创 2023-10-12 22:00:08 · 1143 阅读 · 0 评论 -
ThreadPoolExecutor线程池实战
ThreadPoolExecutor线程池实战Demo已开源至Github,threadDemo1.配置TreadPoolPropertyThreadPoolTaskExecutor构造方法:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, Time原创 2021-06-06 11:01:41 · 627 阅读 · 0 评论 -
自定义线程池理论知识部分
一、线程池是什么线程池是一种基于池化思想管理线程的工具。创建/销毁是一个耗时操作,频繁使用会降低整体性能,使用线程池维护多个线程,可有效降低运行中性能开销,以及更好的管理线程。Java中自定义线程池是自JDK1.5后出现的ThreadPoolExecutor。 Executor提供了一种思想:将任务提交和任务执行进行解耦,在编码时只需将要执行耗时操作逻辑放入Runanble中即可,无需关心线程调度和执行。ExecutorService提供了扩充执行任务的能力,在执行线程内操作时可以获取执行后的返回原创 2021-06-06 10:58:32 · 267 阅读 · 0 评论 -
ThreadPoolExecutor线程池学习笔记
一、线程池是什么线程池是一种基于池化思想管理线程的工具。创建/销毁是一个耗时操作,频繁使用会降低整体性能,使用线程池维护多个线程,可有效降低运行中性能开销,以及更好的管理线程。Java中自定义线程池是自JDK1.5后出现的ThreadPoolExecutor。 Executor提供了一种思想:将任务提交和任务执行进行解耦,在编码时只需将要执行耗时操作逻辑放入Runanble中即可,无需关心线程调度和执行。ExecutorService提供了扩充执行任务的能力,在执行线程内操作时可以获取执行后的返回原创 2021-06-01 21:44:14 · 171 阅读 · 0 评论 -
如何合理使用线程池?
03.线程池:业务代码最常用也最容易犯错的组件创建线程池要使用手动方式,自动创建线程使用newFixedThreadPool和newCachedThreadPool可能因为资源耗尽导致OOM问题。线程池默认工作行为:不会初始化corePoolSize个线程,有任务来了才创建工作线程当核心线程满了之后不会立即扩容线程池,而是把任务堆积到工作队列中当工作队列满了后扩容线程池,一直到线程个数到maximumPoolSize为止如果队列已满且达到最大线程后还有任务进来,按照拒绝策略处理当线程数大于核原创 2021-05-31 21:56:55 · 307 阅读 · 0 评论