什么是ThreadLocal,一篇文章彻底搞懂Java多线程中的ThreadLocal【保姆级教程】

本文将详细介绍Java并发编程(多线程)中常见的 ThreadLocal 类以及如何去使用它。

ThreadLocal类

1、ThreadLocal 是 Java 中提供的一种机制,用于为每个线程提供独立的变量副本,确保每个线程都有自己的变量,而不会和其他线程共享这些变量(即每个线程都有独立的存储空间,线程之间互不干扰。)

用途:主要用于解决多线程并发访问时的线程安全问题,尤其是在不想使用复杂的锁机制时,它是非常有效的工具。

2、创建方式:

2.1 最基础的:

ThreadLocal tl = new ThreadLocal();

这时:

  • 没有初始值;

  • 第一次调用 get() 会返回 null(除非重写 initialValue()

    ThreadLocal<String> local = new ThreadLocal<String>() {
         
         
        @Override
        protected String initialValue() {
         
         
            return "默认值";
        }
    };
    

2.2 推荐方式:这个本质上也是创建一个 ThreadLocal 实例。

ThreadLocal<String> local = ThreadLocal.withInitial(() -> "默认值");

3、常用方法:

get()

  • 获取当前线程的 ThreadLocal 变量值。
  • 如果该线程是第一次调用 get(),则会返回通过 initialValue()withInitial() 方法指定的初始值。

set(T value)

  • 设置当前线程的 ThreadLocal 变量值。

remove()

  • 移除当前线程的 ThreadLocal 变量,清除与线程绑定的值,释放内存。

initialValue()

  • 为当前线程提供初始值,当线程第一次调用 get() 时,如果没有通过 set() 设置值,就会调用 initialValue()

withInitial(Supplier<? extends T>)

  • Java 8 引入的工厂方法,用来简化 ThreadLocal 的初始化过程。它接受一个 Supplier 接口,提供初始化值。

4、示例:

public class Test {
   
   

    // 创建一个 ThreadLocal 用于存储每个线程的账户余额:初始余额 100
    private static ThreadLocal<Integer> balance = ThreadLocal.withInitial(() -> 100); 

    public void withdraw(int amount) {
   
   
        balance.set(balance.get() - amount); // 每个线程更新自己的余额
    }

    public int getBalance() {
   
   
        return balance.get(); // 获取当前线程的余额
    }

    public static void main(String[] args) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学鸡!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值