首页 > 其他分享 >ThreadLocal

ThreadLocal

时间:2024-08-08 19:55:42浏览次数:14  
标签:局部变量 public ThreadLocal static 线程 id

为什么多线程需要加锁

1.ThreadLocal的介绍

从Java官方文档中的描述:

ThreadLocal类用来提供线程内部的局部变量。这种变量子在多线程环境下访问(通过get和set方法)时能保证各个线程的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。
我们可以得知的ThreadLocal的作用是:提供线程内的局部变量,不同的线程之间互不干扰,这种变量在线程的生命周期内起作用,减少一个线程内多个函数或组件之间一些公共变量传递的复杂度。

总结: ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
特点:

  1. 线程并发;
  2. 传递数据;
  3. 线程隔离;

1.2基本使用

1.2.1常用方法

在使用之前,我们先认识几个ThreadLocal的常用方法

方法声明描述
ThreadLocal()创建ThreadLocal对象
public void set(T value)设置当前线程绑定的局部变量
public T get()获取当前线程绑定的局部变量
public void remove()移除当前线程的绑定局部变量
1.2.2使用场景

通常我们在需要利用全局变量来传递数据时就可以利用ThreadLocal来进行。比如:在后续请求中,前端一般会携带JWT令牌,通过JWT令牌可以解析出当前登录用户id,这时,我们可以将用户id存储在ThreadLocal中,在其他功能需要用到用户id时,就可以直接通过ThreadLocal来获取。

1.2.3使用

先用创建一个类对TreadLocal进行封装

public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    public static Long getCurrentId() {
        return threadLocal.get();
    }

    public static void removeCurrentId() {
        threadLocal.remove();
    }
}

存放员工id

//设置当前登录用户id
 BaseContext.setCurrentId(employee.getId());

使用id

           //设置创建人id
           em.setCreateUser(BaseContext.getCurrentId());
           //设置更新人id
           em.setUpdateUser(BaseContext.getCurrentId());

标签:局部变量,public,ThreadLocal,static,线程,id
From: https://blog.csdn.net/yrc1314/article/details/140928628

相关文章

  • ThreadLocal原理(二)
    ThreaddLocal源码方法不是很多,主要有get()方法,set(Tvalue)方法,remove()方法,initialValue()方法.set(Tvalue)方法set方法用于设置线程本地变量的值.源码如下.publicvoidset(Tvalue){//获取当前线程Threadt=Thread.currentThread();/......
  • 【并发】ThreadLocal常用场景
    ThreadLocal经常被用到,尤其是在以下场景中:数据库连接管理:每个线程使用自己的数据库连接,以避免连接被多个线程同时使用而导致的并发问题。可以在多线程环境下确保每个线程使用的数据库连接是独立的,避免了连接池中的连接被多个线程共享的风险。会话管理:每个线程都有自......
  • 【并发】ThreadLocal是什么
    ThreadLocal是Java中用于实现线程局部变量的类。它为每个使用该变量的线程提供独立的副本,因此每个线程都可以独立地改变它自己的副本,而不会影响其他线程的副本。这对于需要在线程之间保持独立状态的数据非常有用,例如用户会话、数据库连接等。主要方法ThreadLocal<T>构......
  • ThreadLocal和内存泄漏原理
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、ThreadLocal原理二、ThreadLocal内存泄漏三、为什么使用弱引用?总结前言复杂事简单说:ThreadLocal一、ThreadLocal原理每一个线程绑定一个ThreadLocalMap,里面存放该线程自己的数据,......
  • ThreadLocal
    ThreadLocal是Java中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。通常,我们会使用synchronzed关键字或者lock来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁......
  • 关于ThreadLocal使用完后要不要使用remove方法进行释放
    ThreadLocal会为每个线程分配一个变量副本,在Thread类中通过ThreadLocalMap进行保存,key为ThreadLocal对象,value为设置的值,其中key为弱引用。接下来要从以下2个方面进行讨论:1、ThreadLocal是局部变量还是全局变量2、程序中是否使用了线程池首先来讨论2,如果程序未使用线程池,那么......
  • 科普文:TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin
    概叙TransmittableThreadLocal的介绍,直接看官网:https://github.com/alibaba/transmittable-thread-local目前使用中的稳定发布版本v2.x在 分支2.x上。帮助文档:https://github.com/alibaba/transmittable-thread-local#-%E5%8A%9F%E8%83%BD这篇文章主要介绍了Transmitta......
  • ThreadLocal 维护数据库连接、事务管理
    即便添加业务,也不能维护原子性,因为每个Dao都有自己的connection因此,我们需要使用ThreadLocal维护一个唯一的Connectionpackagecom.powernode.bank.mvc;importcom.powernode.bank.exceptions.AppException;importcom.powernode.bank.exceptions.MoneyNotEnoughException;......
  • 从ThreadLocal底层源码一直聊到内存泄漏,干货满满!!
    小强最近在疯狂补习高并发的相关知识,但是在学到threadLocal时有点力不从心了,尤其是threadLocal的底层架构和如何导致内存泄漏,今天我们帮小强一把!!把这一块彻底聊清楚!!!文章目录1.threadLocal的前世今生1.为什么要使用threadLocal2.threadLocal和Synchonized的比较3.使用场......
  • Java笔记之ThreadLocal
    定义:ThreadLocal叫做线程变量,该变量对其他线程而言是隔离的,是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本,并且该副本只能当前Thread使用,因此不存在多线程共享的问题。原理:Thread类有一个类型ThreadLocalMap的实例变量ThreadLocals,每个线程都有一个......