threadlocal与inheritableThreadLocal的区别

package com.dev.test;

public class MyThreadLocal {
    
/**
 * 用于验证threadlocal与inheritableThreadLocal的区别
 * @param args
 */
    public static void main(String[] args) {
        ThreadLocal<String> mainThreadLocal=new ThreadLocal();
        System.out.println("------ThreadLocal-------");
        mainThreadLocal.set("--main thread set string");
        System.out.println("在main线程中threadlocal="+mainThreadLocal.get());
        Thread thread1=new Thread(new MyThreadLocal().new ChildThread(mainThreadLocal));
        thread1.start();
        
        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("再次获取在main线程中threadlocal="+mainThreadLocal.get());
        System.out.println("------ThreadLocal  end-------");
        System.out.println("总结threadlocal:主线程中设置的threadlocal参数子线程无法获取;");
        System.out.println("              子线程中设置、修改的threadlocal在主线程中也无法获得(针对值引用)");
        
        
        System.out.println("------InheritableThreadLocal-------");
        InheritableThreadLocal<String> mainInheritableThreadLocal=new InheritableThreadLocal();
        mainInheritableThreadLocal.set("--main thread set string");
        System.out.println("在main线程中InheritableThreadLocal="+mainInheritableThreadLocal.get());
        Thread thread2=new Thread(new MyThreadLocal().new ChildThread2(mainInheritableThreadLocal));
        thread2.start();
        
        try {
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("再次获取在main线程中InheritableThreadLocal="+mainInheritableThreadLocal.get());
        System.out.println("------InheritableThreadLocal  end-------");
        System.out.println("总结InheritableThreadLocal:主线程中设置的InheritableThreadLocal参数子线程可以获取;");
        System.out.println("              子线程中设置、修改的InheritableThreadLocal在主线程中也无法获得(针对值引用)");
    }
    
    /**
     * 测试threadlocal
     * @author wb-zhanghengyu
     *
     */
     class ChildThread implements Runnable{
        ThreadLocal<String> childThreadLocal;
        public ChildThread(ThreadLocal<String> childThreadLocal){
            this.childThreadLocal=childThreadLocal;
        }

        @Override
        public void run() {
            System.out.println("在childThread中获取main线程中的threadlocal="+childThreadLocal.get());
            System.out.println("在 child  thread中调用threadlocal.set()。。。");
            childThreadLocal.set("--child thread set string");
            System.out.println("在childThread中获取child线程中修改的threadlocal="+childThreadLocal.get());
        }
        
    }
     /**
         * 测试inheritablethreadlocal
         * @author wb-zhanghengyu
         *
         */
    class ChildThread2 implements Runnable{
        InheritableThreadLocal<String> childInheritableThreadLocal;
        public ChildThread2(InheritableThreadLocal<String> childInheritableThreadLocal){
            this.childInheritableThreadLocal=childInheritableThreadLocal;
        }

        @Override
        public void run() {
            System.out.println("在childThread中获取main线程中的InheritableThreadLocal="+childInheritableThreadLocal.get());
            System.out.println("在 child  thread中调用InheritableThreadLocal.set()。。。");
            childInheritableThreadLocal.set("--child thread set string");
            System.out.println("在childThread中获取child线程中修改的InheritableThreadLocal="+childInheritableThreadLocal.get());
            childInheritableThreadLocal.remove();
            System.out.println("在childThread中获取child线程中remove后的InheritableThreadLocal="+childInheritableThreadLocal.get());
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值