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;
    }
目录
相关文章
|
7月前
|
存储 Java 数据管理
ThreadLocal的使用
`ThreadLocal`是Java中的线程局部变量工具,确保每个线程都有自己的变量副本,互不干扰。适用于保持线程安全性数据和跨方法共享数据。基本用法包括创建实例、设置和获取值以及清除值。例如,创建ThreadLocal对象后,使用`.set()`设置值,`.get()`获取值,`.remove()`清除值。注意ThreadLocal可能引起内存泄漏,应适时清理,并谨慎使用以避免影响代码可读性和线程安全性。它是多线程编程中实现线程局部数据管理的有效手段。
95 10
|
7月前
|
存储 Java
ThreadLocal 有什么用
ThreadLocal 有什么用
55 0
|
存储 算法 安全
深入详解ThreadLocal
在我们日常的并发编程中,有一种神奇的机制在静悄悄地为我们解决着各种看似棘手的问题,它就是 ThreadLocal 。
21517 9
深入详解ThreadLocal
|
存储 Java
|
存储 分布式计算 安全
什么是ThreadLocal?
这篇文章是慕课网上一门免费课程《ThreadLocal》的观后总结。这门课将ThreadLocal讲得非常清晰易懂,又深入底层原理和设计思想,是我看过的最好的ThreadLocal的资料,现在把用自己的话,把它整理成文字版本。 总共预计产出四篇文章,这是第一篇。
270 3
|
存储 Java
ThreadLocal相关使用
ThreadLocal相关使用
198 0
ThreadLocal相关使用
|
存储 安全 Java
ThreadLocal 使用详解
ThreadLocal 是线程本地变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程
556 0
|
存储 Java
ThreadLocal理解
ThreadLocal理解
293 0
ThreadLocal理解