ThreadLocal多线程之间存取数据互不干扰

17 篇文章 0 订阅

原理理解参考1
原理理解参考2

ThreadLocal多线程之间存取数据互不干扰

public class ThreadLocalController {

    private static ThreadLocal<List<String>> threadLocal = new ThreadLocal<>();

    public void setThreadLocal(List<String> value) {
        threadLocal.set(value);
    }

     public void getThreadLocal() {
        threadLocal.get().forEach(name ->{
            System.out.println(Thread.currentThread().getName()+"###" + name );
        });
        //每次使用完最后一定记得remove,多线程容易造成内存泄漏!!
        threadLocal.remove();
    }


    public static void main(String[] args) {

        final ThreadLocalController test = new ThreadLocalController();

        new Thread(new Runnable() {
            @Override
            public void run() {
                List<String> strs = new ArrayList<String>();
                strs.add("1");
                strs.add("2");
                strs.add("3");
                test.setThreadLocal(strs);
                test.getThreadLocal();
            }
        },"t1").start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                List<String> strs = new ArrayList<String>();
                strs.add("a");
                strs.add("b");
                test.setThreadLocal(strs);
                test.getThreadLocal();
            }
        },"t2").start();
    }
}

输出:

t2###a
t2###b
t1###1
t1###2
t1###3

注意:
   ThreadLocal正确的使用方法每次使用完ThreadLocal都调用它的remove()方法清除数据。
   将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉 。
具体学习上面原理理解参考2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值