ThreadLocal

简介: ThreadLocal字面意思本地线程,ThreadLocal使每个线程之间是隔离的,数据是独立的,我们使用过session都知道 session是一个会话,我们可以用它来存储一些用户的基本信息,这样每个用户在服务端都能取到,ThreadLocal也可以做到, ThreadLocal将相应的信息存储在当前的线程中,只有当前线程能够访问,其他线程不能访问,其实ThreadLocal 可以说是一个定制化的Map。

ThreadLocal字面意思本地线程,ThreadLocal使每个线程之间是隔离的,数据是独立的,我们使用过session都知道 session是一个会话,我们可以用它来存储一些用户的基本信息,这样每个用户在服务端都能取到,ThreadLocal也可以做到, ThreadLocal将相应的信息存储在当前的线程中,只有当前线程能够访问,其他线程不能访问,其实ThreadLocal 可以说是一个定制化的Map。


下面我们通过一个示例来演示怎么使用ThreadLocal,我们用ThreadLocal来存储用户对象,然后取出用户对象,移除 用户对象 threadLocal.set(threadLocalUser)存储用户的信息 threadLocal.get()获取当前线程存储的信息 threadLocal.remove()移除当前线程储存的信息


如果我们在executorService.shutdown()关闭线程池后再去get(),那么将会返回null,因为线程池已经关闭 不知道是从那个线程中取,所以返回null。


package thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * ThreadLocal
 */
public class ThreadLocalTest {
    private static ThreadLocal<ThreadLocalUser> threadLocal = new ThreadLocal<ThreadLocalUser>();
    final static ExecutorService executorService = Executors.newCachedThreadPool();
    /**
     * 获取本地线程值
     */
    static void getThreadLocalUser(){
        System.out.println(Thread.currentThread().getName()+"  :  "+threadLocal.get());
    }
    /**
     * 移除本地线程值
     */
    static void removeThreadLocalUser(){
        threadLocal.remove();
        System.out.println(Thread.currentThread().getName()+"  :  "+threadLocal.get());
    }
    public static void main(String[] args) {
        executorService.submit(() ->{
            ThreadLocalUser threadLocalUser = new ThreadLocalUser();
            threadLocalUser.setUserId("123456");
            threadLocalUser.setRoleId("1");
            threadLocal.set(threadLocalUser);
            getThreadLocalUser();
            removeThreadLocalUser();
        });
        executorService.submit(() ->{
            ThreadLocalUser threadLocalUser = new ThreadLocalUser();
            threadLocalUser.setUserId("131420");
            threadLocalUser.setRoleId("2");
            threadLocal.set(threadLocalUser);
            getThreadLocalUser();
            removeThreadLocalUser();
        });
        executorService.shutdown();
    }
}


我们可以看出,ThreadLocal其实是存放在threadLocals,而threadLocals是ThreadLocalMap 的一个成员变量,所以ThreadLocal实际上只是一个外壳,里面层层封装


public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
            if (map != null)
        map.set(this, value);
            else
        createMap(t, value);
    }
    ThreadLocal.ThreadLocalMap threadLocals = null;
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
目录
相关文章
|
3月前
|
Java 测试技术 索引
ThreadLocal详解
文章详细讨论了Java中的`ThreadLocal`,包括它的基本使用、定义、内部数据结构`ThreadLocalMap`、主要方法(set、get、remove)的源码解析,以及内存泄漏问题和避免策略。`ThreadLocal`提供了线程局部变量,确保多线程环境下各线程变量的独立性,但不当使用可能导致内存泄漏,因此建议在不再需要`ThreadLocal`变量时调用其`remove`方法。
109 2
ThreadLocal详解
|
6月前
|
存储 Java 数据管理
ThreadLocal的使用
`ThreadLocal`是Java中的线程局部变量工具,确保每个线程都有自己的变量副本,互不干扰。适用于保持线程安全性数据和跨方法共享数据。基本用法包括创建实例、设置和获取值以及清除值。例如,创建ThreadLocal对象后,使用`.set()`设置值,`.get()`获取值,`.remove()`清除值。注意ThreadLocal可能引起内存泄漏,应适时清理,并谨慎使用以避免影响代码可读性和线程安全性。它是多线程编程中实现线程局部数据管理的有效手段。
88 10
|
6月前
|
存储 Java
ThreadLocal 有什么用
ThreadLocal 有什么用
52 0
|
存储 算法 安全
深入详解ThreadLocal
在我们日常的并发编程中,有一种神奇的机制在静悄悄地为我们解决着各种看似棘手的问题,它就是 ThreadLocal 。
21513 9
深入详解ThreadLocal
|
11月前
|
存储
ThreadLocal
ThreadLocal
52 0
|
存储 安全 Java
ThreadLocal介绍和应用
ThreadLocal介绍和应用
65 0
|
缓存 安全 Java
浅谈ThreadLocal
浅谈ThreadLocal
148 0
|
存储 SQL Java
ThreadLocal的其他应用
request对象跟PageHelper
101 0
|
存储 安全 Java
我把 ThreadLocal 能问的,都写了(上)
我把 ThreadLocal 能问的,都写了(上)
我把 ThreadLocal 能问的,都写了(上)