
并发
文章平均质量分 86
爱叨叨的程序狗
码农,不只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 评论 -
深入了解ThreadLocal:避免内存泄漏的陷阱与最佳实践
在深入讨论的内存泄漏问题之前,我们先来了解一下的基本概念。是Java中的一个工具类,提供了一种线程级别的数据隔离机制。通过,我们可以在每个线程中存储自己的数据副本,互不影响,从而简化了多线程编程中的共享数据问题。是一个强大的工具,能够在多线程环境中解决共享数据的问题。然而,开发者在使用时应当小心,特别是在长时间存在的线程和线程池等场景下,要注意及时清理,以避免内存泄漏的发生。通过正确的使用习惯和最佳实践,可以更好地发挥的优势,确保多线程环境下的数据安全和性能。原创 2023-12-12 15:37:12 · 1082 阅读 · 0 评论 -
深入解析ThreadPoolTaskExecutor的阻塞队列技术选型
是Spring框架中强大的线程池实现,通过合理选择阻塞队列类型,我们可以更好地满足应用程序的需求,提高性能和稳定性。在实际应用中,根据具体场景调整线程池配置,选择适当的阻塞队列,将有助于构建出更为健壮和高效的多线程应用。希望本文对您理解的阻塞队列提供了一些有价值的信息。如果您有任何问题或建议,请随时在评论中分享。原创 2023-12-06 09:54:18 · 1032 阅读 · 0 评论 -
订单场景-基于Redisson实现订单号生成
订单、指定长度随机码生成是业务系统中重要且不可避免的一个需求,往往在电商系统中,业务量、并发量庞大,如何不重复、快速、安全的生成一个订单号成了需要重点考虑的问题。当生成订单号的逻辑和订单创建、落库逻辑分开,每次点击提交订单时,前端调用单独的生成订单号接口,再拿着生成的订单号去请求订单创建、落库的逻辑,每次生成的订单号都不一致,这样便保证了每次的请求都不是重复的,接下来实现不重复的订单号逻辑即可。需要注意的是,使用分布式锁会增加系统的复杂度和开销,可能会影响系统的性能和可用性。原创 2023-12-01 15:52:10 · 1331 阅读 · 1 评论 -
优雅的并发编程-CompletableFuture
以上是接口串行执行的逻辑,当前服务器环境一般都是多核心、多线程,服务器可以同时处理多个任务,如果此时还使用单线程去执行,有些“暴殄天物”,并且接口响应速度会比较慢,那么优化的方式就是开启多个线程去分别执行不同的逻辑,那么我们可以使用。单线程和多线程相比,举个不恰当的例子:当你为了报仇,踌躇满志上山叩拜师门,经过十年寒窗苦练、不舍昼夜的练习,终于学成归来下山复仇,结果仇家拿出AK 47一阵突突,云淡风轻的跟你说:“大人,时代变了”的无力感。原创 2023-11-08 21:36:39 · 552 阅读 · 0 评论 -
Reactor的Publisher与Subscriber
在计算机中,响应式变成或者反应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地变大静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。原创 2022-10-30 09:51:19 · 1099 阅读 · 0 评论 -
并发-MySQL乐观锁
场景商城有种商品仅剩一个库存,用户A的下单请求进入到后端接口,由于用户A的网络环境不太好,导致请求卡死,此时用户B也进入下单页面,由于用户A网络环境不好,并没有执行减库存操作,用户B查询到的库存也是1,那么用户B点击下单按钮,最终剩余一个库存却下单成功了两次,我们需要使用技术手段解决业务上的问题,即:保证不同线程请求进来,当前线程操作的数据没有被其他线程修改过。MySQL乐观锁使用version字段标识版本使用updateTime来标识版本单独新增字段表示版本或使用updateTime字段原创 2022-03-08 10:56:12 · 304 阅读 · 0 评论