转载请注明出处:

  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整合JavaMail

    1.发送简单邮件 导入依赖 implementation 'org.springframework.boot:spring-boot-starter-mail:3.0.2' 开启相关协议,获取密码~ ...

  2. 基于LSTM的股票价格预测模型【附源码】

    导语 本文介绍了LSTM的相关内容和在股票价格预测上的应用. LSTM的股票价格预测 LSTM(Long Short Term Memory)是一种 特殊的RNN类型,同其他的RNNs相比可以更加方便 ...

  3. 解密数据可视化软件、BI软件和数字孪生软件的不同

    在现代企业和科技领域,数据起着至关重要的作用.为了更好地管理和理解数据,不同类型的软件工具应运而生,其中包括数据可视化软件.BI(Business Intelligence)软件和数字孪生软件.虽然它 ...

  4. 【Python】【OpenCV】轮廓检测

    Code: 1 import cv2 2 import numpy as np 3 4 img = np.zeros((200, 200), dtype=np.uint8) 5 img[50:150, ...

  5. 实现两个 JSON 对象的对比

    问题描述 在 Java 中,对于两个对象的对比,如果没有重写 equals 方法,那么将会默认使用 Object 默认的 equals 方法来比较两个对象.这种比较方式是通过比较两个对象的内存地址是否 ...

  6. Java 并发编程(六)并发容器和框架

    传统 Map 的局限性 HashMap JDK 1.7 的 HashMap JDK 1.7 中 HashMap 的实现只是单纯的 "数组 + 链表 " 的组合方式,具体的组成如下: ...

  7. 干掉PPT!现场编码的职级晋升答辩你参加过么?

    摘要:研发讲究的是真本事,是骡子是马咱们还得代码上见真章. 最近这小半年的时间,凭借对各种API的巧妙应用,我从一个差点被淘汰的"前浪"变成了公司人人尊敬的技术委员会副主席,工作思 ...

  8. Hudi自带工具DeltaStreamer的实时入湖最佳实践

    摘要:本文介绍如何使用Hudi自带入湖工具DeltaStreamer进行数据的实时入湖. 本文分享自华为云社区<华为FusionInsight MRS实战 - Hudi实时入湖之DeltaStr ...

  9. 带你上手全新版本的Webpack 5

    摘要:webpack5快速入门,船新版本,建议收藏 本文分享自华为云社区<webpack5快速入门,船新版本,建议收藏>,作者:北极光之夜.. 一. 快速上手 1.1 Webpack功能: ...

  10. 应用开发专家一席谈:开发低代码,上手低门槛,AppCube使能Citizen Developer,人人都是开发者

    摘要:让不确定因子变为确定性因子,把复杂留给平台,简单留给开发者,是软件开发效率改进一直努力的方向,也是低代码理念的来源. 本文分享自华为云社区<应用开发专家一席谈:开发低代码,上手低门槛,Ap ...