JUC小册——ThreadLocal原理以及用法。

目录

一、ThreadLocal介绍

二、ThreadLocal使用场景

1. 用户会话管理

2. 数据库连接

3. 事务管理

4. 日志上下文

三、ThreadLocal使用示例


一、ThreadLocal介绍

ThreadLocal 是 Java 中的一个类,提供了线程局部变量的功能。每个线程都可以通过 ThreadLocal 创建一个变量,这个变量对其他线程是不可见的。这样可以避免多个线程之间的竞争,确保每个线程都有自己独立的变量副本。

ThreadLocal 在 Java 中提供了一些常用的操作 API:

1.  T get() :获取当前线程所对应的线程局部变量的值。如果当前线程没有对应的值,则返回 null (如果没有设置初始值),或调用 initialValue() 方法返回的值。

2. void set(T value) :设置当前线程所对应的线程局部变量的值。

3. void remove() :移除当前线程所对应的线程局部变量的值。调用此方法后,后续对 get() 的调用将返回 null ,并且会释放与该线程相关的内存。

4.  T initialValue() :这是一个 protected 方法,允许子类重写以提供初始值。默认实现返回 null

5.  static <T> ThreadLocal<T> withInitial(Supplier<? extends T> supplier) :这是一个静态方法,用于创建一个 ThreadLocal 实例,并指定初始值的生成器。

二、ThreadLocal使用场景

1. 用户会话管理

在 Web 应用中,可以使用 ThreadLocal 来存储用户的会话信息,以便在同一线程中访问,而不需要将信息传递给每个方法。

2. 数据库连接

在数据库操作中,可以使用 ThreadLocal 来存储数据库连接对象,以确保每个线程都有自己的连接,避免多线程访问同一个连接导致的问题。

3. 事务管理

在需要管理事务的场景中,可以使用 ThreadLocal 来存储当前线程的事务状态,确保每个线程的事务是独立的。

4. 日志上下文

在日志记录中,可以使用 ThreadLocal 来存储当前线程的上下文信息,比如用户 ID 或请求 ID,以便在日志中记录相关信息。

三、ThreadLocal使用示例

下面看看如何使用 ThreadLocal 存储和访问线程局部变量。

public class ThreadLocalExample {
    // 创建一个 ThreadLocal 变量
    private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) {
        // 创建多个线程
        Thread thread1 = new Thread(() -> {
            threadLocalValue.set(1);
            System.out.println("Thread 1 value: " + threadLocalValue.get());
        });

        Thread thread2 = new Thread(() -> {
            threadLocalValue.set(2);
            System.out.println("Thread 2 value: " + threadLocalValue.get());
        });

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待线程结束
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 主线程的值
        System.out.println("thread value: " + threadLocalValue.get());
    }
}

结果:

Thread 1 value: 1

Thread 2 value: 2

thread value: 0

可以看到ThreadLocal 用于存储每个线程的整数值。主线程和两个子线程都有各自独立的 ThreadLocal 变量,互不干扰。主线程的值为 0,因为在初始化的时候设置的就是0。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值