首页 > 其他分享 >【并发】ThreadLocal是什么

【并发】ThreadLocal是什么

时间:2024-07-31 22:24:30浏览次数:13  
标签:Thread 什么 initial value 并发 ThreadLocal 线程 new

ThreadLocal 是 Java 中用于实现线程局部变量的类。它为每个使用该变量的线程提供独立的副本,因此每个线程都可以独立地改变它自己的副本,而不会影响其他线程的副本。这对于需要在线程之间保持独立状态的数据非常有用,例如用户会话、数据库连接等。

主要方法

  • ThreadLocal<T> 构造方法:创建一个线程局部变量。
  • get():返回当前线程对应的线程局部变量的值。
  • set(T value):设置当前线程对应的线程局部变量的值。
  • remove():移除当前线程对应的线程局部变量的值,避免内存泄漏。

使用场景

ThreadLocal 常用于以下场景:

  1. 线程安全的对象共享:每个线程有自己独立的对象实例,避免了使用同步机制。
  2. 数据库连接、会话管理:确保每个线程有自己的数据库连接或会话。

示例代码

以下是一个简单的示例,展示了如何使用 ThreadLocal

public class ThreadLocalDemo {
    // 创建一个 ThreadLocal 变量,用于存储每个线程的独立变量
    private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 5; i++) {
                // 获取当前线程的局部变量值
                int value = threadLocalValue.get();
                System.out.println(Thread.currentThread().getName() + " initial value: " + value);
                
                // 设置新的值
                threadLocalValue.set(value + 1);
                
                System.out.println(Thread.currentThread().getName() + " new value: " + threadLocalValue.get());
            }
            // 移除线程局部变量,防止内存泄漏
            threadLocalValue.remove();
        };

        Thread thread1 = new Thread(task, "Thread-1");
        Thread thread2 = new Thread(task, "Thread-2");

        thread1.start();
        thread2.start();
    }
}

输出示例

Thread-1 initial value: 0
Thread-1 new value: 1
Thread-1 initial value: 1
Thread-1 new value: 2
Thread-1 initial value: 2
Thread-1 new value: 3
Thread-1 initial value: 3
Thread-1 new value: 4
Thread-1 initial value: 4
Thread-1 new value: 5
Thread-2 initial value: 0
Thread-2 new value: 1
Thread-2 initial value: 1
Thread-2 new value: 2
Thread-2 initial value: 2
Thread-2 new value: 3
Thread-2 initial value: 3
Thread-2 new value: 4
Thread-2 initial value: 4
Thread-2 new value: 5

在这个示例中,每个线程都有自己独立的 ThreadLocal 变量值,它们不会互相影响。每个线程都从初始值 0 开始,并在每次循环中递增其值。通过使用 ThreadLocal,确保了线程间的数据隔离,避免了并发问题。

标签:Thread,什么,initial,value,并发,ThreadLocal,线程,new
From: https://blog.csdn.net/hui_zai_/article/details/140724456

相关文章

  • 亲测推荐!PixPin便捷高效,让你的截图工作轻松搞定,还在等什么?
    前言如果你经常使用电脑,是不是也经常遇到这样的烦恼:需要频繁地截图、标注、编辑图片,可是手里的截图工具却总是那么不给力?要么功能单一,要么操作复杂,让人头疼不已;今天咱们的小江湖就要给大家带来一款绝对让你眼前一亮的截图神器——PixPin!听名字是不是就感觉有点不一样?没错,它可......
  • 什么样的人适合学习网络安全?
    一、引言在当今数字化的时代,网络安全已经成为了一个至关重要的领域。随着网络攻击的日益频繁和复杂,对于网络安全专业人才的需求也在不断增长。然而,并不是每个人都适合学习网络安全。那么,究竟什么样的人适合投身于这个充满挑战和机遇的领域呢?二、适合学习网络安全的人群特点......
  • 在Linux系统中,etc目录中的profile是什么意思
    在Linux系统中,/etc/profile文件是一个非常重要的系统级配置文件,它主要用于设置系统级的环境变量和执行系统范围内的初始化脚本。以下是关于/etc/profile文件的详细解释:一、基本定义/etc/profile文件位于Linux系统的/etc目录下,这是一个全局性的配置文件,对所有用户都有效。它不......
  • Java并发(十六)一文搞懂Java 线程池原理
    简介什么是线程池线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。为什么要用线程池如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建和销毁线程。如此一来,会大大降低系统的效率,可能频繁创建和销毁线程的时间......
  • CentOS 7中发布的站点目录应放在什么位置比较合理?
    在CentOS7中,发布的站点目录通常应放在/var/www/目录下,这是比较合理和常见的做法。/var/www/目录专门用于存放Web服务器的站点文件,便于管理和访问。以下是对这一选择的详细解释:站点目录位置选择理由标准性:/var/www/目录是Linux系统中用于存放Web站点内容的标准位置之一,特别是......
  • centos 7 各个目录的功能和用途是什么
    CentOS7的各个目录在Linux系统中扮演着重要的角色,它们各自具有特定的功能和用途。以下是CentOS7中一些主要目录的功能说明:1./(根目录)功能:包含了整个文件系统的所有文件和目录,是文件系统的起点。使用场景:任何时候都可以访问该目录下的文件和目录。2./bin功能:存放系统最......
  • 掩码语言模型MLM有什么应用场景
    上一文介绍了《什么是掩码模型MLM》,本文继续讲讲它的应用场景。MLM(MaskedLanguageModel,掩码语言模型)在自然语言处理(NLP)领域有着广泛的应用场景。以下是MLM的一些主要应用场景:1.预训练语言模型MLM是许多预训练语言模型(如BERT、RoBERTa、ALBERT等)的核心技术之一。通过在大......
  • P1.53和P1.86的LED显示屏什么区别
    我们的夏游记有些客户在采购LED显示屏时,对点间距或其它的参数不是很了解,如P1.53和P1.86之间有什么区别,选择哪一款性价高更高呢?业角度为大家分析,希望能对大家提供到一些帮助。目前,LED显示屏在室内场合的应用中,P1.53和P1.86是应用比较广泛的两款小间距LED系列,它们在分辨率......
  • 什么?在本地使用LLaMA大模型
    LLaMA是什么?LLaMA3.1是Meta公司开发的最新大型语言模型(LLM)系列,具有多种规格和显著改进。LLaMA3.1版本包含8B、70B和405B参数模型,专为各种复杂任务设计,包括多语言支持、翻译、对话生成和文本总结。其中LLaMA3.1405B是迄今为止最大和最强大的版本,具有显著......
  • 即使输出与参考不匹配,为什么 GEKKO 不提供最佳命令?
    以下内容与此问题相关:使用GEKKO的预测控制模型我正在尝试应用MPC将房间的温度保持在定义的范围内,但即使输出存在分歧,GEKKO也会给我空命令。我运行上一个问题中的更正代码:#Importlibraryimportnumpyasnpimportpandasaspdimporttimefromgekkoimpo......