ThreadLocal

一、ThreadLocal

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

        ThreadLoal变量,线程局部变量,同一个ThreadLOcal所包含的对象在不同的Thread中有不同的副本

        因为每个Thread内有自己的实例副本,且实例副本只能由当前Thread使用

        每个Thread都有自己的实例副本,且其它Thread不可访问,那么就不存在多线程共享的问题

ThreadLocal提供了线程本地的实例,它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本,ThreadLocal变量通常被private static修饰,当一个线程结束时,它所用的所有ThreadLocal相对的实例副本都可被回收

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);
    }

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();
    }
 
 
private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

remove()

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

学习:

https://blog.csdn.net/u010445301/article/details/111322569?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522CBEBD7D3-39AB-4F2E-BA0E-C2A8D786E19E%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=CBEBD7D3-39AB-4F2E-BA0E-C2A8D786E19E&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-111322569-null-null.142^v100^control&utm_term=ThreadLocal&spm=1018.2226.3001.4187icon-default.png?t=O83Ahttps://blog.csdn.net/u010445301/article/details/111322569?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522CBEBD7D3-39AB-4F2E-BA0E-C2A8D786E19E%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=CBEBD7D3-39AB-4F2E-BA0E-C2A8D786E19E&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-111322569-null-null.142^v100^control&utm_term=ThreadLocal&spm=1018.2226.3001.4187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值