首页 > 其他分享 >ThreadLocal ThreadLocalUtil

ThreadLocal ThreadLocalUtil

时间:2024-08-21 10:17:43浏览次数:4  
标签:static ThreadLocalUtil value ThreadLocal InheritableThreadLocal 线程 public

ThreadLocalUtil.java
public class ThreadLocalUtil {

    static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    public static <T> T get() {
        return (T) THREAD_LOCAL.get();
    }

    public static void set(Object value) {
        THREAD_LOCAL.set(value);
    }

    public static void remove() {
        THREAD_LOCAL.remove();
    }
}

 

 

 

7. InheritableThreadLocal保证父子线程间的共享数据

我们知道ThreadLocal是线程隔离的,如果我们希望父子线程共享数据,如何做到呢?可以使用InheritableThreadLocal。先来看看demo

public class InheritableThreadLocalTest {
 
   public static void main(String[] args) {
       ThreadLocal<String> threadLocal = new ThreadLocal<>();
       InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();
 
       threadLocal.set("你好,七度");
       inheritableThreadLocal.set("你好,七度");
 
       Thread thread = new Thread(()->{
           System.out.println("ThreadLocal value " + threadLocal.get());
           System.out.println("InheritableThreadLocal value " + inheritableThreadLocal.get());
       });
       thread.start();
       
   }
}
// 运行结果
ThreadLocal value null
InheritableThreadLocal value 你好,七度

可以发现,在子线程中,是可以获取到父线程的 InheritableThreadLocal 类型变量的值,但是不能获取到 ThreadLocal 类型变量的值。

获取不到ThreadLocal 类型的值,我们可以好理解,因为它是线程隔离的嘛。InheritableThreadLocal 是如何做到的呢?原理是什么呢?

Thread类中,除了成员变量threadLocals之外,还有另一个成员变量:inheritableThreadLocals。它们两类型是一样的:

parent的inheritableThreadLocals不为null时,就会将parentinheritableThreadLocals,赋值给前线程的inheritableThreadLocals。说白了,就是如果当前线程的inheritableThreadLocals不为null,就从父线程哪里拷贝过来一个过来,类似于另外一个ThreadLocal,但是数据从父线程那里来的

 

8. ThreadLocal的应用场景和使用注意点

ThreadLocal的很重要一个注意点,就是使用完,要手动调用remove()

ThreadLocal的应用场景主要有以下这几种:

  • 使用日期工具类,当用到SimpleDateFormat,使用ThreadLocal保证线性安全
  • 全局存储用户信息(用户信息存入ThreadLocal,那么当前线程在任何地方需要时,都可以使用)
  • 保证同一个线程,获取的数据库连接Connection是同一个,使用ThreadLocal来解决线程安全的问题
  • 使用MDC保存日志信息。

 

转自:https://blog.csdn.net/gongzi_9/article/details/126754648

标签:static,ThreadLocalUtil,value,ThreadLocal,InheritableThreadLocal,线程,public
From: https://www.cnblogs.com/lshan/p/18371059

相关文章

  • 【Java 并发编程】(四) ThreadLocal 源码解读
     介绍每个Thread对象,内部有一个ThreadLocalMapthreadLocals,这是一个哈希表,底层是一个Node[]table;当在某个线程中调用ThreadLocal的set方法时,会使用Thread.currentThread获取当前先线程的thread对象,然后将ThreadLocal对象作为key,将set方法的参数作为value......
  • ThreadLocal 家族:ThreadLocal、InheritableThreadLocal 与 TransmittableThreadLocal
    在当今的Java多线程编程领域,ThreadLocal及其相关的扩展InheritableThreadLocal和TransmittableThreadLocal宛如三把利剑,为我们在处理线程本地数据时提供了强大而灵活的工具。深入理解它们各自的特点、差异以及适用场景,对于我们编写出高效、可靠且稳定的多线程代码具有至......
  • ThreadLocal源码解析
    ThreadLocal有内部类ThreadLocalMap,ThreadLocalMap是ThreadLocal的核心1.每个线程下的有一个ThreadLocalMapstaticclassThreadLocalMap{staticclassEntryextendsWeakReference<ThreadLocal<?>>{Objectvalue;Entry(ThreadLocal<?>k,Ob......
  • Java 中的线程本地存储(ThreadLocal)机制介绍
    Java中的ThreadLocal是一个用于实现线程本地存储(ThreadLocalStorage,TLS)的机制。它可以为每个线程提供独立的变量副本,使得一个线程中的变量不受其他线程中的变量的影响。ThreadLocal通常用于在多线程环境下避免线程之间共享数据,从而实现线程安全。一、基本用法ThreadLoca......
  • 深入理解 ThreadLocal:机制、原理与实践
    引言ThreadLocal是Java中一个非常重要的工具,广泛用于解决多线程环境下变量共享的问题。然而,ThreadLocal的使用也可能带来一些隐患,尤其是在结合线程池的场景中,可能导致数据混乱。本文将深入探讨ThreadLocal的工作机制及其可能带来的问题,并给出相应的解决方案。一、Thr......
  • [Java并发]ThreadLocal补充
    ThreadLocal缺点及解决方案每个Thread上都有一个threadLocals属性,它是一个ThreadLocalMap,里面存放着一个Entry数组,key是ThreadLocal类型的弱引用,value是对用的值。所有的操作都是基于这个ThreadLocalMap操作的。但是它有一个局限性,就是不能在父子线程之间传递。即在子线程中无......
  • ThreadLocal
    为什么多线程需要加锁1.ThreadLocal的介绍从Java官方文档中的描述:ThreadLocal类用来提供线程内部的局部变量。这种变量子在多线程环境下访问(通过get和set方法)时能保证各个线程的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是privatestatic类型的,用于关联......
  • ThreadLocal原理(二)
    ThreaddLocal源码方法不是很多,主要有get()方法,set(Tvalue)方法,remove()方法,initialValue()方法.set(Tvalue)方法set方法用于设置线程本地变量的值.源码如下.publicvoidset(Tvalue){//获取当前线程Threadt=Thread.currentThread();/......
  • 【并发】ThreadLocal常用场景
    ThreadLocal经常被用到,尤其是在以下场景中:数据库连接管理:每个线程使用自己的数据库连接,以避免连接被多个线程同时使用而导致的并发问题。可以在多线程环境下确保每个线程使用的数据库连接是独立的,避免了连接池中的连接被多个线程共享的风险。会话管理:每个线程都有自......
  • 【并发】ThreadLocal是什么
    ThreadLocal是Java中用于实现线程局部变量的类。它为每个使用该变量的线程提供独立的副本,因此每个线程都可以独立地改变它自己的副本,而不会影响其他线程的副本。这对于需要在线程之间保持独立状态的数据非常有用,例如用户会话、数据库连接等。主要方法ThreadLocal<T>构......