java get all threadlocal from thread

public void mytest() {    long start = System.currentTimeMillis();    Thread thread = Thread.currentThread();

    Field threadLocalsField = null;    try {        threadLocalsField = Thread.class.getDeclaredField("threadLocals");

        threadLocalsField.setAccessible(true);

        Class threadLocalMapKlazz = Class.forName("java.lang.ThreadLocal$ThreadLocalMap");        Field tableField = threadLocalMapKlazz.getDeclaredField("table");        tableField.setAccessible(true);

        Object table = tableField.get(threadLocalsField.get(thread));

        int threadLocalCount = Array.getLength(table);        StringBuilder sb = new StringBuilder();        StringBuilder classSb = new StringBuilder();

        int leakCount = 0;

        for (int i = 0; i < threadLocalCount; i++) {            Object entry = Array.get(table, i);            if (entry != null) {                Field valueField = entry.getClass().getDeclaredField("value");                valueField.setAccessible(true);                Object value = valueField.get(entry);                if (value != null) {                    classSb.append(value.getClass().getName()).append(", ");

                } else {                    classSb.append("null, ");                }                leakCount++;            }        }

        sb.append("possible ThreadLocal leaks: ")                .append(leakCount)                .append(" of ")                .append(threadLocalCount)                .append(" = [")                .append(classSb.substring(0, classSb.length() - 2))                .append("] ");

        log.warn(sb.toString());    } catch (Exception e) {        e.printStackTrace();    }    long end = System.currentTimeMillis();    long cost = end - start;    log.info("获取ThreadLocal耗时:{}", cost);

结果: possible ThreadLocal leaks: 9 of 16 = [java.util.Collections$SynchronizedMap, null, java.lang.Boolean, java.lang.Boolean, null, java.lang.Integer, java.lang.Boolean, brave.propagation.TraceContext, null] 

原文地址:https://www.cnblogs.com/zhangzhi19861216/p/12152973.html

时间: 2024-08-01 00:14:18

java get all threadlocal from thread的相关文章

java笔记--用ThreadLocal管理线程,Callable&lt;V&gt;接口实现有返回值的线程

用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3899890.html  "谢谢-- Callable<V>接口类似于Runnable,两者都是为了哪些其实例可能被另一个线程执行的类设计的, 但是Runnable不会返回

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

java多线程模式ThreadLocal原理简述及其使用详解

原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解 代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm ThreadLocal是为了使每个线程保存一份属于自己的数据. 先看一个使用ThreadLocal的实例. package com.zuidaima.aop.framework; import com.zuidaima.core.NamedThreadLocal; public abstra

java 中的 ThreadLocal

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各个线程中访问的是不同的对象. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.通 过ThreadLocal.set()将这个新创

Java Synchronized 与 ThreadLocal 异同

同:都是为了线程安全 异:synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象, 这样就隔离了多个线程对数据的数据共享.而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享.Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的 数据隔离.当然ThreadLocal并不能替代synchronized,它们处理

MyBatis基础:使用java提供的ThreadLocal类优化代码

public class MyBaitsView { //使用java提供的ThreadLocal类来存储SqlSession对象,方便同一线程获得sqlSession public static ThreadLocal<SqlSession> threadLocal=new ThreadLocal(); public static SqlSessionFactory factory; //初使化SqlSessionFactory工厂 static { try { InputStream is

菜鸟之路——Java并发之ThreadLocal

一.什么是ThreadLocal ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,ThreadLocal的目的是为了解决多线程访问资源时的共享问题.但其实这么说并不准确.ThreadLocal是为变量在每个线程中都创建了一个副本(此副本的意思是通过每个线程中的new操作来创建内容一样的新的对象,每个线程创建一个,而不是使用对象的引用),使每个线程可以访问自己内部的副

Java 多线程之--ThreadLocal 简介

<span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 在多线程开发中,经常会遇见在run方法里面调用一个公共的属性的事情,由于每次start都会创建一个线程,因此</span> <span style="font-size: 18px; font-family: Arial,

谈谈Java中的ThreadLocal

什么是ThreadLocal ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本.通过ThreadLocal可以将对象的可见范围限制在同一个线程内. 跳出误区 需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根就是无意义的!sysnchronized是一种互斥同步机制,是为了保证在多线程环境下对于共享资源的正确访问.而ThreadLocal从本质上讲,无非是提供了一个"