zoukankan      html  css  js  c++  java
  • ThreadLocal和InheritableThreadLocal使用

    InheritableThreadLocal代码

    public class InheritableThreadLocal<T> extends ThreadLocal<T> {
        protected T childValue(T parentValue) {
            return parentValue;
        }
        ThreadLocalMap getMap(Thread t) {
           return t.inheritableThreadLocals;
        }
        void createMap(Thread t, T firstValue) {
            t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
        }
    }

    测试代码

    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * Created by hujunzheng on 2017/6/23.
     */
    
    class ThreadCount {
        private static final AtomicInteger nextId = new AtomicInteger(0);
        private static final ThreadLocal<Integer> threadCount =
                ThreadLocal.withInitial(() -> nextId.getAndIncrement());//返回的是重写了ThreadLocal initialValue()方法的ThreadLocal.SuppliedThreadLocal对象
    
        public static int get() {
            return threadCount.get();
        }
    }
    
    class ThreadSign {
        private static final AtomicInteger nextId = new AtomicInteger(0);
        private static final ThreadLocal<Integer> threadCount = new InheritableThreadLocal<Integer>() {
            @Override
            protected Integer initialValue() {
                return nextId.getAndIncrement();
            }
        };
    
        public static int get() {
            return threadCount.get();
        }
    }
    
    
    public class ThreadLocalTest {
    
        public static void testThreadLocal() {
            for (int i = 0; i < 5; ++i) {
                int pi = i;
                new Thread(() -> {
                    System.out.println(Thread.currentThread().getName() + " count->" + ThreadCount.get());
                    for (int j = 0; j < 5; ++j) {
                        new Thread(() -> System.out.println("       " + Thread.currentThread().getName() + " count->" + ThreadCount.get()), "cthread" + j + " pthread" + pi).start();
                    }
                }, "pthread" + i).start();
            }
        }
    
        public static void testInheritableThreadLocal() {
            for(int i=0; i<5; ++i) {
                int pi = i;
                new Thread(() -> {
                    System.out.println(Thread.currentThread().getName() + " sign->" + ThreadSign.get());
                    for(int j=0; j<5; ++j) {
                        new Thread(() -> System.out.println("       " + Thread.currentThread().getName() + " sign->" + ThreadSign.get()), "cthread" + j + " pthread" + pi).start();
                    }
                }, "pthread" + i).start();
            }
        }
    
        public static void main(String[] args) {
    //        testThreadLocal();
            testInheritableThreadLocal();
        }
    }

    测试结果

      分别为testThreadLocal() 和 testInheritableThreadLocal() 测试结果。

        

      比较后,看到ThreadLocal里的值,子线程里不能获得;InheritableThreadLocal里的值,子线程可以获得。

      

    跟踪一下代码

      

    参考

      Java8增加功能--Effectively final 功能

  • 相关阅读:
    20145204《信息安全系统设计基础》期中总结
    20145204&20145212信息安全系统实验一报告
    k8s运维记
    服务器免密登录
    非正常关闭vi编辑器产生swp文件怎么删除
    centos7 安装 python3 、docker、 docker-compose 脚本
    数据库高可用方案
    centos7安装docker-compose报错解决办法
    centos7 一键安装python3 --转发
    安装docker-compose的两种方式
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/7069223.html
Copyright © 2011-2022 走看看