ThreadLocal

ThreadLocal

  1. 线程本地存储机制,可以把数据缓存到该线程中,只要是该线程执行的方法,就可以随时获取缓存的数据。
  2. ThreadLocal是用ThreadLocalMap实现的,每个线程都会有一个ThreadLocalMap,key为ThreadLocal,value为要缓存的值
  3. 一个线程可以有多个ThreadLocal
  4. 如果在线程池中使用ThreadLocal 会造成内存溢出,在线程池中的线程会一直存在,所以ThreadLocalMap就会一直存在,里面的ThreadLocal的value就会一直存在,继续使用该线程就会一直在ThreadLocalMap中添加value,从而造成内存溢出,可以在使用的时候手动调用remove方法,来删除ThreadLocalMap中的ThreadLocal的value
public static void main(String[] args) throws InterruptedException {
        /**
         * 1、线程本地存储机制,可以把数据缓存到该线程中,只要是该线程执行的方法,就可以随时获取缓存的数据。
         * 2、ThreadLocal是用ThreadLocalMap实现的,每个线程都会有一个ThreadLocalMap,key为ThreadLocal,value为要缓存的值
         * 3、一个线程可以有多个ThreadLocal
         * 4、如果在线程池中使用ThreadLocal 会造成内存溢出,
         * 在线程池中的线程会一直存在,所以ThreadLocalMap就会一直存在,里面的ThreadLocal的value就会一直存在,
         * 继续使用该线程就会一直在ThreadLocalMap中添加value,从而造成内存溢出,
         * 可以在使用的时候手动调用remove方法,来删除ThreadLocalMap中的ThreadLocal的value
         * 5、可以在连接管理的场景使用
         */
        new Thread(()->{
            ThreadLocal t  = new ThreadLocal();
            ThreadLocal t1  = new ThreadLocal();
            t.set("AA");
            t1.set("t1");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+":"+t.get());
            System.out.println(Thread.currentThread().getName()+":"+t1.get());
            t1.remove();
            System.out.println(Thread.currentThread().getName()+":"+t1.get());
        },"线程A").start();
        new Thread(()->{
            ThreadLocal t  = new ThreadLocal();
            t.set("BB");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+":"+t.get());

        },"线程B").start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值