ThreadLocal的介绍及其使用

发布时间 2023-08-30 17:06:45作者: ashet
    
    private static final ThreadLocal<Integer> THREAD_LOCAL = new ThreadLocal<>();

    @Test
    void threadLocalTest() {
        Assertions.assertDoesNotThrow(() -> {
            // 线程1存储数据
            Thread t1 = new Thread(() -> {
                THREAD_LOCAL.set(10);
                log.info("Thread 1 stored data: " + THREAD_LOCAL.get()); // 输出10
            });

            // 线程2存储数据
            Thread t2 = new Thread(() -> {
                THREAD_LOCAL.set(20);
                log.info("Thread 2 stored data: " + THREAD_LOCAL.get()); // 输出20
            });

            t1.start();
            t2.start();

            try {
                t1.join();
                t2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 主线程获取数据
            log.info("Main thread data: " + THREAD_LOCAL.get()); // 输出null

            // 清除数据
            THREAD_LOCAL.remove();
        });
    }

ThreadLocal是Java中的一个线程级别的变量,它提供了一种线程内部的数据共享和访问机制。通过ThreadLocal,每个线程可以独立地存储和获取自己的数据,而不会影响其他线程。

ThreadLocal的用法如下:

  1. 创建ThreadLocal实例:通过ThreadLocal<T>来创建一个ThreadLocal对象,其中T表示泛型类型,代表要存储的数据类型。
  2. 存储数据:使用set(T value)方法将数据存储到当前线程的ThreadLocal对象中。每个线程都有自己独立的数据副本,互不干扰。
  3. 获取数据:使用get()方法从当前线程的ThreadLocal对象中获取数据。
  4. 初始化数据:可以通过重写initialValue()方法来为ThreadLocal提供初始值。该方法会在第一次调用get()set()时被调用。
  5. 删除数据:可以使用remove()方法来清除当前线程的ThreadLocal对象中的数据。