首页 > 其他分享 >线程-ThreadLocal

线程-ThreadLocal

时间:2024-11-05 21:35:37浏览次数:2  
标签:Thread 局部变量 value ThreadLocal static 线程

线程-ThreadLocal

ThreadLocal 是 Java 中的一个类,提供了一种创建线程局部变量的机制。每个访问 ThreadLocal 变量的线程都有一个独立的、初始化的变量副本。

这可以避免线程间的同步问题,因为每个线程只能访问自己的ThreadLocal变量。通过ThreadLocal为线程添加的值只能由这个线程访问到,其他的线程无法访问,因此就避免了多线程之间的同步问题。

常用方法

  • T get():返回当前线程所持有的线程局部变量的副本。
  • void set(T value):为当前线程设置线程局部变量的值。
  • void remove():移除当前线程所持有的线程局部变量,释放该变量的内存。
  • protected T initialValue():返回线程局部变量的初始值(可以被子类重写)。

初始化:创建ThreadLocal变量。

private static ThreadLocal<T> threadLocal = new ThreadLocal<>();

设置值:使用set(T value)方法为当前线程设置值。

threadLocal.set(value);

获取值:使用get()方法获取当前线程的值。

T value = threadLocal.get();

移除值:使用remove()方法在线程结束时清除ThreadLocal变量,以避免内存泄漏。

threadLocal.remove();

使用一

public class ThreadLocalExample {  
    // 创建一个 ThreadLocal 变量 并用 withInitial 方法指定了初始值为 1。
    private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 1);  
    

    public static void main(String[] args) {  
        Runnable task = () -> {  
            // 获取当前线程的线程局部变量的值  
            Integer value = threadLocalValue.get();  
            System.out.println("Initial Value in " + Thread.currentThread().getName() + ": " + value);  

            // 设置当前线程的线程局部变量的值  
            threadLocalValue.set(value + 1);  
            System.out.println("Updated Value in " + Thread.currentThread().getName() + ": " + threadLocalValue.get());  
        };  

        // 创建多个线程来演示  
        Thread thread1 = new Thread(task, "Thread-1");  
        Thread thread2 = new Thread(task, "Thread-2");  

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

//输出
Initial Value in Thread-1: 1  
Initial Value in Thread-2: 1  
Updated Value in Thread-1: 2  
Updated Value in Thread-2: 2

使用二

定义ThreadLocal工具类

public class LoginUserContext {
    //定义SystemUser工具类,在同一个线程内就不需要再重复获取数据库的SystemUser了,直接在ThreadLocal中拿
    private static final ThreadLocal<SystemUser> userThreadLocal = new ThreadLocal<>();
    //设置值
    public static void setLoginUser(SystemUser systemUser) {
        userThreadLocal.set(systemUser);
    }
    //获取值
    public static SystemUser getLoginUser() {
        return userThreadLocal.get();
    }
    //清除userThreadLocal
    public static void clear() {
        userThreadLocal.remove();
    }
}

注意事项

  • 内存泄漏:如果 ThreadLocal 变量不再使用,但有线程一直在使用,可能会导致内存泄漏。应当在不需要时调用 remove() 方法
  • 使用场景:适用于需要保持线程独立状态的场景,比如用户会话、数据库连接、或是一些缓存数据等。

标签:Thread,局部变量,value,ThreadLocal,static,线程
From: https://www.cnblogs.com/21CHS/p/18528893

相关文章

  • Thread多线程
    多线程并发与并行(了解)并行(parallel):指多个事件任务在同一时刻发生(同时发生)。指在同一时刻,有多条指令在多个处理器上同时执行。单核CPU同一时刻只能处理一条指令,所以单核CPU做不到并行处理。并发(concurrency):指两个或多个事件在同一个微小的时间段内发生。指在同一个时刻只能有一......
  • Qt多线程- QThread 创建多线程程序
    QThread创建多线程程序QThread类功能简介今天说一下Qt中的多线程。QThread类不依赖平台的管理线程的方法。一个QThread类的对象管理一个线程,一般从QThread继承一个自定义类,并重新定义虚函数run(),在run()函数里实现线程需要完成的任务。将应用程序的线程称为......
  • 什么是线程?什么是进程?
    什么是线程?什么是进程?它们之间的区别是什么?线程:线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但每个线程都有自己独立的程序计数器、栈和寄存器组。......
  • Java多线程编程(三)一>详解synchronized, 死锁,wait和notify
    目录: 一.synchronized的使用:   二. 常见死锁情况: 三.如何避免死锁:  四.wait和notify一.synchronized的使用: 我们知道synchronized锁具有互斥的特点:synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他线程如果也执......
  • 开源数据库 - mysql - innodb源码阅读 - master线程(一)
    masterstruct/**Themasterthreadcontrollingtheserver.*/voidsrv_master_thread(){DBUG_TRACE;srv_slot_t*slot;//槽位THD*thd=create_internal_thd();//创建内部线程ut_ad(!srv_read_only_mode);//断言srv_read_only_m......
  • 初识线程池
    一、什么是线程池?线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。二、线程池的作用池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理......
  • 操作系统线程的组织与调度(schedule)
    一、线程调度schedule在操作系统中,调度器(Scheduler)的主要任务是管理CPU的时间分配给各个进程和线程,以优化特定的性能指标,如响应时间、吞吐量和CPU利用率。调度器通常分为三类:长期调度器、中期调度器和短期调度器,但在现代操作系统中,最常讨论的是短期调度器,即CPU调度器。下面是......
  • 深入理解 `std::shared_ptr`:原理、用法及其线程安全性
    在C++中,智能指针是现代内存管理的重要工具,尤其是在复杂的多线程环境中,能显著减少内存泄漏和悬空指针等问题。std::shared_ptr是C++11引入的一种共享智能指针,通过引用计数机制管理对象的生命周期。本文将详细介绍std::shared_ptr的基本用法、循环引用问题、线程安全性及其局......
  • Python中的生产者-消费者模型:多进程与多线程的实践
    Python中的生产者-消费者模型:多进程与多线程的实践在现代编程中,生产者-消费者模型是一种常见的设计模式,用于处理任务队列和并发执行。Python提供了多种工具来实现这一模型,包括threading模块和multiprocessing模块。本文将通过一个实际的案例——从网页上批量下载图片——来......