JUC并发编程之深入理解ThreadLocal

简介: ThreadLocal是Java标准库提供的一个工具类,位于java.lang包下。它允许你创建一个线程局部变量,每个线程都可以独立地访问自己的变量副本,互不干扰。这在某些场景下非常有用,比如在多线程环境下,每个线程需要维护自己的状态信息,但又不想通过方法参数传递的方式来实现。

1. ThreadLocal概述


ThreadLocal是Java标准库提供的一个工具类,位于java.lang包下。它允许你创建一个线程局部变量,每个线程都可以独立地访问自己的变量副本,互不干扰。这在某些场景下非常有用,比如在多线程环境下,每个线程需要维护自己的状态信息,但又不想通过方法参数传递的方式来实现。


ThreadLocal的核心思想是为每个线程维护一个独立的变量副本。当一个线程访问ThreadLocal变量时,实际上是在访问该线程自己的变量副本。这就避免了多线程之间的竞争和冲突。


2. ThreadLocal的使用方法


2.1 创建ThreadLocal变量


要使用ThreadLocal,首先需要创建一个ThreadLocal对象,并指定变量的初始值。ThreadLocal提供了initialValue()方法来指定初始值。这个方法在第一次访问该ThreadLocal变量时会被调用,为当前线程生成一个初始值。


ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Initial Value");


2.2 获取和设置ThreadLocal变量的值


通过get()方法可以获取当前线程的ThreadLocal变量的值。


String value = threadLocal.get();


通过set()方法可以设置当前线程的ThreadLocal变量的值。


threadLocal.set("New Value");


2.3 移除ThreadLocal变量


通过remove()方法可以移除当前线程的ThreadLocal变量。注意,一旦移除后,下次访问该ThreadLocal变量时会重新调用initialValue()方法生成一个新的初始值。


threadLocal.remove();


3. ThreadLocal的工作原理


要深入理解ThreadLocal,我们需要了解其工作原理。在Java中,每个Thread对象都有一个ThreadLocalMap实例,这个实例是一个存储ThreadLocal变量和对应值的映射。当我们调用ThreadLocal.set()方法设置变量的值时,实际上是将变量存储在当前线程的ThreadLocalMap中。


class Thread {
    ThreadLocal.ThreadLocalMap threadLocals = null;
    // ...
}
class ThreadLocal<T> {
    static class ThreadLocalMap {
        // 内部存储ThreadLocal变量和对应值的映射
        // ...
    }
    // ...
}


每个ThreadLocal实例在ThreadLocalMap中都有一个唯一的key,通过这个key可以找到对应的值。由于每个线程都有自己的ThreadLocalMap实例,不同线程之间的ThreadLocal变量互不干扰。


4 线程池中的使用


在使用线程池时,由于线程会被重用,ThreadLocal中的值可能会被多个任务共享。如果在任务执行完成后没有显式地调用remove()方法清理ThreadLocal变量,可能导致下次任务使用时出现意外的数据。


为了避免这种情况,可以在任务执行之前调用remove()方法来确保ThreadLocal变量不会被其他任务复用。


public class ThreadPoolUsage {
    private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            executorService.execute(() -> {
                int value = threadLocal.get();
                System.out.println(Thread.currentThread().getName() + ": " + value);
                threadLocal.set(value + 1);
                threadLocal.remove(); // 清理ThreadLocal变量
            });
        }
        executorService.shutdown();
    }
}


相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
为什么大型语言模型都在使用 SwiGLU 作为激活函数?
SwiGLU可以说是在大语言模型中最常用到的激活函数,我们本篇文章就来对他进行详细的介绍。
1937 9
|
12月前
|
监控 数据库连接 测试技术
《深入数据库连接池:解锁其核心作用与配置奥秘》
在数字化时代,数据库连接池作为数据库访问架构中的核心组件,通过资源重用、提升响应速度、优化资源分配和防止泄漏等方式,显著提高系统性能与稳定性。其关键在于合理选择连接池库(如HikariCP、Apache DBCP等),并科学配置参数(如初始连接数、最大/最小连接数、超时时间等)。结合性能测试与监控优化配置,可构建高性能、高可靠性的应用系统,满足业务需求。
283 5
|
设计模式 前端开发 Java
javaweb中MVC讲解!
JavaWeb MVC是一种设计模式,用于将Web应用的模型(Model)、视图(View)和控制器(Controller)分离,以实现职责解耦。模型负责数据管理和业务逻辑,视图负责展示数据,控制器负责处理用户请求并协调模型和视图。三层架构则将应用分为表现层、业务逻辑层和数据访问层,每层各司其职,提高系统的灵活性和可维护性。MVC主要应用于表现层,而三层架构则更侧重于整体系统结构。两者可以共存,共同提升项目的开发效率和质量。
425 1
|
人工智能 搜索推荐 UED
Bot 商店 + 一键优化提示词 Prompt,开启AI新体验!| Botnow上新
Botnow 迎来了重大更新,新增了 Bot 商店功能,并优化了 Bot 编排,提升了 AI 使用效率。用户可在 Bot 商店中轻松浏览和体验各类官方及用户发布的 Bots,并可一键发布或下架自己的 Bot。此外,还推出了一键优化 Prompt 功能,帮助用户生成清晰、精准的指令,提升对话质量。新老用户快来体验吧![链接]
618 5
|
存储 区块链 数据安全/隐私保护
Uniswap丨justswap丨pancakeswap去中心化薄饼交易所系统开发逻辑分析及源码示例
Uniswap、JustSwap、PancakeSwap均为去中心化交易所,采用自动做市商(AMM)机制。Uniswap基于以太坊,通过Router、Factory和Pair合约实现交易功能;JustSwap基于TRON网络,支持TRC20代币交易,无手续费;PancakeSwap基于Binance Smart Chain,功能类似Uniswap,支持BSC代币交易。
|
XML 设计模式 Java
PowerMock:静态方法与私有方法测试
PowerMock是Java单元测试中扩展Mockito的框架,允许模拟静态方法、构造函数、私有方法和final类,以增强测试隔离和覆盖率。主要应用场景包括静态方法模拟、私有方法测试和构造函数/Final类模拟。然而,使用时需注意配置复杂性、避免过度使用、精确控制模拟行为和遵循最佳实践。示例展示了如何模拟静态方法,通过添加PowerMock依赖和使用PowerMockito.mockStatic进行静态方法的模拟和验证。正确使用PowerMock能提升测试质量,但应谨慎以保持代码可读性和测试有效性。
727 5
PowerMock:静态方法与私有方法测试
|
Kubernetes 容器
Warning FailedScheduling 14m (x12 over 16m) default-scheduler 0/1 nodes are available: 1 node(s
Warning FailedScheduling 14m (x12 over 16m) default-scheduler 0/1 nodes are available: 1 node(s
535 0
|
网络协议 Ubuntu Linux
在Linux中,什么是网络接口配置?如何配置IP地址?
在Linux中,什么是网络接口配置?如何配置IP地址?
|
机器学习/深度学习 搜索推荐 数据可视化
大数据用户画像之基本概念
大数据用户画像利用大数据技术分析用户基本信息、消费行为、兴趣、社交及地理数据,创建详细用户模型,助力企业精准营销。涉及技术包括数据挖掘、大数据处理(Hadoop、Spark)、数据可视化、机器学习和数据库管理。通过用户画像,企业可实现市场定位、个性化推荐、精准广告、产品优化和风险控制。学习该领域需掌握多个技术栈,包括相关算法、工具及业务理解。
1925 4
|
云计算
云计算计费方式深度解析,看完这篇全懂了!
云计算计费方式深度解析,看完这篇全懂了! 随着科技的飞速发展,云计算已经成为了我们生活中不可或缺的一部分。然而,对于云计算的计费方式,你是否感到困惑呢?这篇文章将为你深度解析云计算的计费方式,让你看完之后全懂了!
904 1

热门文章

最新文章