转载请注明出处:

  1. 先展示threadLocal的一个简单封装,该封装用来在不同的请求线程中解析用户参数。在请求经过过滤器时,

对用户的信息进行设置入 ThreadLocalContext 中,可在同一个请求的不同业务中获取用户的信息参数。

import com.homepage.UserInfo;

public class ThreadLocalContext {

    private static ThreadLocal<UserInfo> userThreadLocal = new ThreadLocal<>();

    public static UserInfo getThreadLocalContext(){
UserInfo user = userThreadLocal.get();
if (user == null){
return new UserInfo();
}
return user;
} public static void setUserThreadLocal(UserInfo user){
userThreadLocal.set(user);
} public static void clear(){
userThreadLocal.remove();
}
}

  以上为ThreadLocal的一个简单封装。

  2. 使用的场景主要为:

  • 每个线程需要有自己单独的实例
  • 实例需要在多个方法中共享,但不希望被多线程共享

  3.原理:

       每个运行的线程都会有一个类型为ThreadLocal.ThreadLocalMap的map,这个map就是用来存储与这个线程绑定的变量,

    map的key就是ThreadLocal对象,value就是线程正在执行的任务中的某个变量的包装类Entry。可以通过set方法来看threadLocal实现的原理:

/**
* Sets the current thread's copy of this thread-local variable
* to the specified value. Most subclasses will have no need to
* override this method, relying solely on the {@link #initialValue}
* method to set the values of thread-locals.
*
* @param value the value to be stored in the current thread's copy of
* this thread-local.
*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}

  

4.ThreadLocal作用:

    在多线程程序中,同一个线程在某个时间段只能处理一个任务.我们希望在这个时间段内,任务的某些变量能够和处理它的线程进行绑定,

  在任务需要使用这个变量的时候,这个变量能够方便的从线程中取出来.ThreadLocal能很好的满足这个需求,用ThreadLocal变量的程序看起来

  也会简洁很多,因为减少了变量在程序中的传递。

5. 为什么ThreadLocalMap的Entry是一个weakReference?     
       使用weakReference,能够在ThreadLocal失去强引用的时候,ThreadLocal对应的Entry能够在下次gc时被回收,回收后的空间能够得到复用,
  在一定程度下能够避免内存泄露.
 
6. 使用ThreadLocal应该注意什么?
       在使用ThreadLocal对象,尽量使用static,不然会使线程的ThreadLocalMap产生太多Entry,从而造成内存泄露
 
7.使用threadLocal 如何避免内存泄露:
  在 threadLocal 中的变量在线程结束之前清空 当前 threadLocal 中的变量。或是在threadLocal中变量使用结束时,手动清除 threadLocal 的变量
  可以调用上面中的

    ThreadLocalContext.clear() 方法或
    ThreadLocalContext.set(null);
  
 
 
 

ThreadLocal应用及理解的更多相关文章

  1. 对ThreadLocal的一些理解

    ThreadLocal也是在面试过程中经常被问到的,本文主要从以下三个方面来谈对ThreadLocal的一些理解: ThreadLocal用在什么地方 ThreadLocal一些细节 ThreadLo ...

  2. Java中ThreadLocal的深入理解

    官方对ThreadLocal的描述: "该类提供了线程局部(thread-local)变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其get或set方法)的每个线程都有自己的局 ...

  3. ThreadLocal类的理解

    首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各 ...

  4. 谈谈对ThreadLocal类的理解

    源码中对于ThreadLocal类的解释是: /** * This class provides thread-local variables. These variables differ from ...

  5. ThreadLocal的简单理解

    目录 一.背景 二.ThreadLocal解决的问题 三.如何创建一个ThreadLocal实例 四.ThreadLocal如何做到线程变量隔离 1.理解3个类 2.看下set方法是如何实现的 3.看 ...

  6. ThreadLocal()理解

    在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使用 ...

  7. Android开发之ThreadLocal原理深入理解

    [Android]ThreadLocal的定义和用途 ThreadLocal用于实现在不同的线程中存储线程私有数据的类.在多线程的环境中,当多个线程需要对某个变量进行频繁操作,同时各个线程间不需要同步 ...

  8. 理解ThreadLocal(之二)

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  9. 正确理解ThreadLocal

    想必很多朋友对 ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理 解,然后根据ThreadLocal类的 ...

  10. ThreadLocal深入理解一

    转载:http://www.cnblogs.com/dolphin0520/p/3920407.html 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使 ...

随机推荐

  1. SpringBoot整合Filter过滤器

    话不多说,直接上核心代码 1.先创建一个Filter类 package com.qbb.reggie.filter; import com.alibaba.fastjson.JSON; import ...

  2. vscode快速配置汇编环境

    微机原理的课程需要,简单快速记录环境的搭建 找到并安装插件masm. MASM/TASM的汇编工具默认是tasm这样就无法在vscode终端进行debug,打开插件设置如下修改: 测试代码实现小写字母 ...

  3. elastic优化

    通过定义keyword 的 "null_value" :"NULL",使得搜索是不用单独使用exists查询.统一用terms查询就能查询到想要的结果 利用co ...

  4. java中final关键字的使用

              1 :在java中final可以修饰类,方法,变量(包括成员变量和局部变量) 第一点:修饰类 特点:修饰的类不能被继承而且成员变量也是可以根据自己需要设置fianl 但final类 ...

  5. libGDX游戏开发之AssetManager资源管理(十)

    libGDX游戏开发之AssetManager资源管理(十) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情 ...

  6. Spring IOC 解析

    Bean 容器的创建 ApplicationContext 的类结构: 通过上图可以看到,具体的 ApplicationContext 有 AnnotationConfigApplicationCon ...

  7. 华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!

    本文分享自华为云社区<华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!>,作者: 华为云头条. 2023年10月10日,华为云正式发布CodeArts API ...

  8. 华为云MVP高浩:打破AI开发瓶颈,解决数据、算法、算力三大难题

    摘要:在高浩看来,大量的数字蓝领人才和AI应用开发人员构成了当前AI行业发展人才之基,这也为高校学生就业初期从事的工作指明了方向,而华为ModelArts平台在教育领域有着天然的数据.算法优势,非常适 ...

  9. 网络性能总不好?网络调优专家AOE帮你来“看看”

    摘要:为提升网络性能.降低人工调优成本,CANN推出了自动化网络调优工具AOE,通过子图调优.算子调优与梯度调优的功能,让网络可以在AI硬件上获得最佳性能. 本文分享自华为云社区<网络性能总不好 ...

  10. 设备如何使用go sdk轻松连接华为云IoT平台?

    摘要:本文介绍使用huaweicloud-iot-device-sdk-go 连接华为云IoT平台,实现简单的华为云文档介绍的四个功能:设备连接鉴权.设备命令.设备消息和设备属性. 本文分享自华为云社 ...