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>() {@Overrideprotected 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 功能

轉載于:https://www.cnblogs.com/hujunzheng/p/7069223.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531252.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mybatis generator修改默認生成的sql模板

相關連接&#xff1a; mybatis-generator擴展教程系列 -- 自定義sql xml文件 git項目地址 轉載于:https://www.cnblogs.com/hujunzheng/p/7110510.html

oauth簡單使用

一、oauth原理參考 理解OAuth 2.0 二、本例中采用授權碼模式 大致流程 &#xff08;A&#xff09;用戶訪問客戶端&#xff0c;后者將前者導向認證服務器。  &#xff08;B&#xff09;用戶選擇是否給予客戶端授權。  &#xff08;C&#xff09;假設用戶給予授權&#xff0c…

我眼中的服務提供和服務消費

服務提供和消費腦圖 服務提供和消費腦圖 參見: 服務提供者, 服務消費者, 服務注冊中心 服務提供者 1.服務提供者啟動&#xff0c;解析xml文件中配置的服務&#xff0c;這里使用Dom4j解析。 2.將服務的一些相關信息注冊到 服務注冊中心。 注&#xff1a;服務相關信息&#xff1a…

shiro整合oauth

前言 如果oauth原理還不清楚的地方&#xff0c;其參考這里。 一、基本思路腦圖 二、客戶端shiro配置 shiro配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:util&q…

springmvc+swagger2

一、swagger2依賴 <!--swagger--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><exclusions><exclusion><artifactId>spring-aop</artifactId><groupId>org.s…

獲取資源文件工具類

如果沒有依賴spring&#xff0c;可以將分割線下的方法去掉 import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframe…

無狀態shiro認證組件(禁用默認session)

準備內容 簡單的shiro無狀態認證 無狀態認證攔截器 import com.hjzgg.stateless.shiroSimpleWeb.Constants; import com.hjzgg.stateless.shiroSimpleWeb.realm.StatelessToken; import org.apache.shiro.web.filter.AccessControlFilter;import javax.servlet.ServletRequest;…

Spring根據包名獲取包路徑下的所有類

參考mybatis MapperScannerConfigurer.java 最終找到 Spring的一個類 ClassPathBeanDefinitionScanner.java 參考ClassPathBeanDefinitionScanner 和它的父類 ClassPathScanningCandidateComponentProvider&#xff0c;將一些代碼進行抽取&#xff0c;得到如下工具類。 import…

java8 Optional正確使用姿勢

Java 8 如何正確使用 Optional import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import org.apache.commons.lang3.StringUtils;import java.util.Optional;Data EqualsAndHashCode(exclude{"self"}) ToString(callSupertrue, exclud…

idea springboot熱部署無效問題

Intellij IDEA 使用Spring-boot-devTools無效解決辦法 springboot項目中遇到的bug <dependencies><!--spring boot 熱加載--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId&g…

lintcode 單詞接龍II

題意 給出兩個單詞&#xff08;start和end&#xff09;和一個字典&#xff0c;找出所有從start到end的最短轉換序列 比如&#xff1a; 1、每次只能改變一個字母。 2、變換過程中的中間單詞必須在字典中出現。 注意事項 所有單詞具有相同的長度。所有單詞都只包含小寫字母。樣例…

lintcode 最大子數組III

題目描述 給定一個整數數組和一個整數 k&#xff0c;找出 k 個不重疊子數組使得它們的和最大。每個子數組的數字在數組中的位置應該是連續的。 返回最大的和。 注意事項 子數組最少包含一個數 樣例 給出數組 [-1,4,-2,3,-2,3] 以及 k 2&#xff0c;返回 8 思路 dp[i][j] max(…

idea模板注釋

類文件頭部的注釋 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java") /** * ${DESCRIPTION} * author ${USER} hujunzheng * create ${YEAR}-${MONTH}-${DAY} ${TIME} **/ public class ${N…

redis分布式鎖小試

一、場景 項目A監聽mq中的其他項目的部署消息&#xff08;包括push_seq, status, environment&#xff0c;timestamp等&#xff09;&#xff0c;然后將部署消息同步到數據庫中&#xff08;項目X在對應環境[environment]上部署的push_seq[項目X的版本]&#xff09;。那么問題來了…

Jackson ObjectMapper readValue過程

1.整體調用棧 2.看一下調用棧的兩個方法 resolve 方法中通過 Iterator i$ this._beanProperties.iterator() 遍歷屬性的所有子屬性&#xff0c;緩存對應的 deserializer。觀察調用棧的方法&#xff0c;可以發現是循環調用的。 3.比如尋找自定義的 LocalDateTime類的序列化實現…

java如何尋找main函數對應的類

參考springboot Class<?> deduceMainApplicationClass() {try {StackTraceElement[] stackTrace new RuntimeException().getStackTrace();for (StackTraceElement stackTraceElement : stackTrace) {if ("main".equals(stackTraceElement.getMethodName())…

jooq實踐

用法 sql語句 SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)FROM AUTHORJOIN BOOK ON AUTHOR.ID BOOK.AUTHOR_IDWHERE BOOK.LANGUAGE DEAND BOOK.PUBLISHED > DATE 2008-01-01 GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAMEHAVING COUNT(*) > 5 ORDER BY AUT…

不同包下,相同數據結構的兩個類進行轉換

import com.alibaba.fastjson.JSON; JSON.parseObject(JSON.toJSONString(obj1), obj2.class) import com.fasterxml.jackson.databind.ObjectMapper; objectMapper.convertValue(obj1, obj2.class); 兩個工具類 JsonUtil JacksonHelper 轉載于:https://www.cnblogs.com/hujunz…

git根據用戶過濾提交記錄

使用SourceTree 使用gitk 轉載于:https://www.cnblogs.com/hujunzheng/p/8398203.html

springboot Autowired BeanNotOfRequiredTypeException

現象 org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named xxxxImpl is expected to be of type com.xxx.xxxImpl but was actually of type com.sun.proxy.$Proxy62 直接Autowired一個實現類&#xff0c;而不是接口 Autowired private XxxServiceI…