JAVA Thread Dump分析线程竞争

简介: JAVA Thread Dump分析线程竞争

Thread Dump分析线程竞争

并不是用了线程池、多线程,就可以带来更高的性能的,总有些地方需要一个锁进行同步。

JAVA 中的synchronized就是一种悲观锁

本次分析Thread Dump发现性能问题是一个OOM问题中的消费速率过慢的问题。

截图

  • 对于线程池pool-20来说,一共12个线程,一个处于running,一个waiting,还有10个处于blocking的状态,基本就是同步进行了,无意义的多线程了。
  • 发现#getData方法是synchronized修饰的,从类名也可以看出来这是一个手写的本地缓存,存在ConcurrentHashMap中,并将其更新以文件的方式刷入磁盘。

具体代码就不能贴了,所以这里只是记录思路!!!

  1. 对于get方法,都是直接从ConcurrentHashMap中取的,它本身就用了CAS来确保线程安全,没有必要用synchronized进行修饰。
  2. 对于set方法,一步是修改入ConcurrentHashMap,一步是刷新文件。他同样是用了synchronized进行修饰。毫无疑问,又没用上ConcurrentHashMap的分段乐观锁的性能优势,又会全部阻塞。
  3. 对于2中提到的刷文件,其实可以交予一个ScheduledThreadPoolExecutor创建的一个定时线程来进行刷新缓存,当一致性要求没那么高的时候,即使宕机或者应用dump等等都不会带来多少问题。
  4. 本地缓存有guava等开源框架,有空还是要学习一下源码的。
目录
相关文章
|
4天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
24 0
|
1天前
|
缓存 Java
Java并发编程:深入理解线程池
【4月更文挑战第26天】在Java中,线程池是一种重要的并发工具,它可以有效地管理和控制线程的执行。本文将深入探讨线程池的工作原理,以及如何使用Java的Executor框架来创建和管理线程池。我们将看到线程池如何提高性能,减少资源消耗,并提供更好的线程管理。
|
2天前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
|
2天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
3天前
|
缓存 Java
【Java基础】简说多线程(上)
【Java基础】简说多线程(上)
6 0
|
3天前
|
SQL Dubbo Java
案例分析|线程池相关故障梳理&总结
本文作者梳理和分享了线程池类的故障,分别从故障视角和技术视角两个角度来分析总结,故障视角可以看到现象和教训,而技术视角可以透过现象看到本质更进一步可以看看如何避免。
|
3天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
3天前
|
安全 Java 编译器
是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
本文简要介绍了Java中的`synchronized`关键字,它是用于保证多线程环境下的同步,解决原子性、可见性和顺序性问题。从JDK1.6开始,synchronized进行了优化,性能得到提升,现在仍可在项目中使用。synchronized有三种用法:修饰实例方法、静态方法和代码块。文章还讨论了synchronized修饰代码块的锁对象、静态与非静态方法调用的互斥性,以及构造方法不能被同步修饰。此外,通过反汇编展示了`synchronized`在方法和代码块上的底层实现,涉及ObjectMonitor和monitorenter/monitorexit指令。
17 0
|
3天前
|
监控 安全 Java
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
11 2
|
3天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
31 1