【一】:ThreadLocal对象的大体实现原理
===>当前线程对象有一个ThreadLocal.ThreadLocalMap属性。
===>声明的ThreadLocal对象最终存储在当前线程对象的属性ThreadLocalMap集合中。
===>ThreadLocalMap集合中的底层是一个Entry数组。每一个ThreadLocal对象经过属性nextHashCode属性计算出当前对象的hashCode决定存储位置。
===>Entry对象存储ThreadLocal对象和要与当前线程绑定的数据。

【二】:ThreadLocal在springAop的事务管理中的应用案例
===>spring的事务管理器类org.springframework.transaction.support.TransactionSynchronizationManager中就运用ThreadLocal对象绑定当前线程数据库事务信息。
===>org.springframework.core.NamedThreadLocal类
===>TransactionSynchronizationManager中绑定了当前线程的数据源,当前线程是否存在活动中的事务,当前线程在事务执行过程中的观察者事件,当前线程是否是只读事务,当前线程事务的名字,当前线程的事务隔离级别。

public abstract class TransactionSynchronizationManager {

    private static final Log logger = LogFactory.getLog(TransactionSynchronizationManager.class);

    private static final ThreadLocal<Map<Object, Object>> resources =
new NamedThreadLocal<Map<Object, Object>>("Transactional resources"); private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
new NamedThreadLocal<Set<TransactionSynchronization>>("Transaction synchronizations"); private static final ThreadLocal<String> currentTransactionName =
new NamedThreadLocal<String>("Current transaction name"); private static final ThreadLocal<Boolean> currentTransactionReadOnly =
new NamedThreadLocal<Boolean>("Current transaction read-only status"); private static final ThreadLocal<Integer> currentTransactionIsolationLevel =
new NamedThreadLocal<Integer>("Current transaction isolation level"); private static final ThreadLocal<Boolean> actualTransactionActive =
new NamedThreadLocal<Boolean>("Actual transaction active");

【三】:ThreadLocal在项目中的应用
===>ThreadLocalContext类的代码
===>ThreadLocalContext可以保存当前线程一些需要上下文存储数据。

public class MyThreadContext {

    private Map<Object,Object> myData = new HashMap<Object,Object>();

    public void put(Object key, Object message){
myData.put(key, message);
} public Object get(Object key){
return myData.get(key);
} public <T> T get(Object key,Class<T> clazz){
return (T) myData.get(key);
} public static MyThreadContext getContext(){
return threadContext.get();
} public static void clearContext(){
threadContext.remove();
} private static ThreadLocal<ThreadContext> threadContext = new ThreadLocal<ThreadContext>() {
protected ThreadContext initialValue() {
return new ThreadContext();
}
};
}

为什么ThreadLocalMap的静态内部类Entry要继承WeakReference<ThreadLocal<?>>?

【java基础】ThreadLocal的实现原理的更多相关文章

  1. Java多线程——ThreadLocal类的原理和使用

    Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...

  2. Java基础--ThreadLocal

    Java中的ThreadLocal 可以看做以线程标识为key的Map,在多线程开发中使用非常方便. 示例 class ThreadEnv { // 用匿名内部类覆盖ThreadLocal的initi ...

  3. Java基础系列-substring的原理

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755235.html JDK 6和JDK 7中substring的原理及区别 substring(i ...

  4. JAVA基础之理解JNI原理

    JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C.C++)的动态库进行交互,给其它语言发挥优势的机会. 有了J ...

  5. 【Java基础】HashMap工作原理

    HashMap Hash table based implementation of the Map interface. This implementation provides all of th ...

  6. 【Java基础】ArrayList工作原理

    ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组.因此最好能给出数组大小的预估值.默认第一次插入元素时创建大 ...

  7. Java基础 StringBuffer、StringBuilder原理浅析

    StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 首先看下面的例子 public sta ...

  8. java基础解析系列(七)---ThreadLocal原理分析

    java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...

  9. java基础解析系列(八)---fail-fast机制及CopyOnWriteArrayList的原理

    fail-fast机制及CopyOnWriteArrayList的原理 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列( ...

  10. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

随机推荐

  1. rails 数据验证

    validates :money,      :presence => true, :numericality => {:only_integer => true}

  2. Terminal(终端) 在 OS X下如何快速调用

    Terminal(终端) 在 OS X下如何快速调用 转载请注明原作者:文章如果对您有所启发或帮助,不介意您请我喝一杯咖啡 ​ Terminal作为人机交流中极其重要的一部分,无论是在Windows. ...

  3. Spring MVC同一方法返回JSON/XML格式

    最近一道面试题,要求同一API接口支持不同格式返回值.一开始是设想通过过滤器(Filter)设置返回值,但是并不可行,因为方法返回值一般都是类型需要做转换,而过滤器则是前置的.另一方面可以通过拦截器的 ...

  4. Core Java 3

    p270~p272 1.创建异常类. 步骤:1)定义一个派生于(继承)Exception或者其子类的类. 2)添加两个构造方法:一个是默认构造器,另一个是带有详细描述信息的构造器. import ja ...

  5. luogu P1017 进制转换

    感觉这个题 是真的恶心 本来单纯就递归写,发现好难 后来用数组记录 然后考虑 指数为 奇和偶数 分别 <0 和 > 进制的情况 其实 用进制数为3 大概讨论四种情况就可以了 由于最近就是在 ...

  6. 51Nod 1419 最小公倍数挑战

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1419 题意: 思路: 要想最大,肯定去找尽量大的互质的数,如果不是互质的 ...

  7. POJ 2253 Frogger(dijkstra变形)

    http://poj.org/problem?id=2253 题意: 有两只青蛙A和B,现在青蛙A要跳到青蛙B的石头上,中间有许多石头可以让青蛙A弹跳.给出所有石头的坐标点,求出在所有通路中青蛙需要跳 ...

  8. DB.使用Oracle时的遇到的问题

    1.(20190225)ojdbc14.jar 来自“E:\ZC_DB\_Connector\Oracle\10g\Oracle Database 10g Release 2 (10.2.0.4) J ...

  9. Spring 及 SpringMVC的web.xml配置详解

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...

  10. Rails 5 Test Prescriptions 第8章 Integration Testing with Capybara and Cucumber

    Capybara:  A complete reference is available atrubydoc.info. 集成测试就是把局部的程序组合起来测试. 端到端测试是一个特殊的集成测试,覆盖了 ...