了解ThreadLocal

ThreadLocal是Java中用于创建线程局部变量的类,每个线程都有自己的副本,确保变量的线程安全。它常用于存储用户信息以避免多线程操作Session时的干扰。ThreadLocal的生命周期与线程关联,长时间不清理可能导致内存泄漏。
摘要由CSDN通过智能技术生成

一.ThreadLocal介绍

Theradlocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。

ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。

二.ThreadLocal的简单使用

package com.example.demo06redis.congig;

public class ThreadLocaDemo {
 
    private static ThreadLocal<String> localVar = new ThreadLocal<String>();
 
    static void print(String str) {
        //打印当前线程中本地内存中本地变量的值
        System.out.println(str + " :" + localVar.get());
        //清除本地内存中的本地变量
        localVar.remove();
    }
    public static void main(String[] args) throws InterruptedException {


        new Thread(new Runnable() {
            public void run() {
                //将本线程中的ThreadLocal变量设置为 local_A
                ThreadLocaDemo.localVar.set("local_A");
                //调用输出方法
                print("A");
                //打印本地变量
                System.out.println("after remove : " + localVar.get());
               
            }
        },"A").start();
 
        Thread.sleep(1000);
 
        new Thread(new Runnable() {
            public void run() {
                ThreadLocaDemo.localVar.set("local_B");
                print("B");
                System.out.println("after remove : " + localVar.get());
              
            }
        },"B").start();
    }
}
 

2.1 ThreadLocal的set()方法:

public void set(T value) {
        //1、获取当前线程
        Thread t = Thread.currentThread();
        //2、获取线程中的属性 threadLocalMap ,如果threadLocalMap 不为空,
        //则直接更新要保存的变量值,否则创建threadLocalMap,并赋值
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            // 初始化thradLocalMap 并赋值
            createMap(t, value);
}

以上代码 ThreadLocal set值时 先会获取当前对象力的TheradLocal属性 如果值不为空则将传入的value赋值,如果为空则创建TheradLoaclMap的实例 并初始化 (初始化为NULL)

2.2 ThreadLocal的get()方法:

public T get() {
        //1、获取当前线程
        Thread t = Thread.currentThread();
        //2、获取当前线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        //3、如果map数据不为空,
        if (map != null) {
            //3.1、获取threalLocalMap中存储的值
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        //如果是数据为null,则初始化,初始化的结果,TheralLocalMap中存放key值为threadLocal,值为null
        return setInitialValue();
    }

 2.1 ThreadLocal的set()方法:

     public void remove() {

         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }

remove方法,直接将ThrealLocal 对应的值从当前相差Thread中的ThreadLocalMap中删除

ThreadLocal其实是与线程绑定的一个变量,它的生命周期将会与线程共存,也就是说如果调用线程一直不终止,那么这个本地变量将会一直存放在他的threadLocals中, 就可能会导致内存溢出。

三、ThreadLocal 常见使用场景

在Web开发中,我们经常需要将一些用户信息存入Session中,但Session是Servlet容器全局共享的,如果多个线程同时操作同一个Session,就会出现互相干扰的情况。此时,我们可以将用户信息存入ThreadLocal中,这样每个线程都只能访问自己的信息,避免了线程安全的问题。

四、总结

ThreadLocal是一个Java中的类,用来创建线程局部变量。每个线程都有自己的局部变量,互相之间不会相互干扰。

ThreadLocal原理:每个线程都有一个ThreadLocalMap对象,在这个对象中存储着key-value键值对。key是ThreadLocal对象,value是我们设置的值。由于每个线程都有自己的ThreadLocalMap,所以每个线程都可以独自存取自己的值。

ThreadLocal使用场景:当我们需要将一个对象保存到ThreadLocal中时,这个对象就是当前线程独自拥有的,其他线程无法访问。这样就可以保证线程安全。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值