java多线程模式ThreadLocal原理简述及其使用详解
来源:互联网 发布:lz77压缩算法图解 编辑:程序博客网 时间:2024/05/11 00:14
原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解
代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm
ThreadLocal是为了使每个线程保存一份属于自己的数据。
先看一个使用ThreadLocal的实例。
- package com.zuidaima.aop.framework;
- import com.zuidaima.core.NamedThreadLocal;
- public abstract class AopContext {
- private static final ThreadLocal <Object> currentProxy= new NamedThreadLocal <Object> ( " Current AOP proxy " );
- public static Object currentProxy() throws IllegalStateException {
- Object proxy= currentProxy.get();
- if (proxy== null ) {
- throw new IllegalStateException(
- " Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available. " );
- }
- return proxy;
- }
- static Object setCurrentProxy(Object proxy) {
- Object old= currentProxy.get();
- if (proxy != null ) {
- currentProxy.set(proxy);
- }
- else {
- currentProxy.remove();
- }
- return old;
- }
- }
上例展示的是spring框架中获取当前线程的代理对象的方法,AopContext.currentProxy(),在本线程的程序调用栈中只要调用AopContext的静态方法就可以获取本线程相关的代理对象。如果不用ThreadLocal,那么这个代理对象在创建后,就要一层层传递下去,才能在后面获取到并使用。
通过这个例子,我们可以知道[b]ThreadLocal主要是提供了一种保持对象的方法以及避免了对象在程序调用中传递的简便访问方法。ThreadLocal与共享数据和同步没有明显关系。[/b]
下面看看相关的源码以了解具体的结构。
- public class Thread implements Runnable {
- // ThreadLocalMap是一个以ThreadLocal为key,Object为值的map,由ThreadLocal维护
- ThreadLocal.ThreadLocalMap threadLocals= null ;
- }
从Thread的源码中可以得知,是每一个Thread持有一个自己的map,并不是一个ThreadLocal持有一个map。
- public class ThreadLocal <T> {
- public T get() {
- // 获取当前线程
- Thread t= Thread.currentThread();
- // 获取当前线程的threadLocals变量
- ThreadLocalMap map= getMap(t);
- // 从当前线程的threadLocals变量中取得本threadLocal为key的值
- if (map != null ) {
- ThreadLocalMap.Entry e= map.getEntry( this );
- if (e != null )
- return (T)e.value;
- }
- return setInitialValue();
- }
- private T setInitialValue() {
- T value= initialValue();
- Thread t= Thread.currentThread();
- ThreadLocalMap map= getMap(t);
- if (map != null )
- map.set( this , value);
- else
- createMap(t, value);
- return value;
- }
- public void set(T value) {
- // 获取当前线程
- Thread t= Thread.currentThread();
- // 获取当前线程的threadLocals变量
- ThreadLocalMap map= getMap(t);
- // 以本threadLocal为key的保存值到当前线程的threadLocals变量中去
- if (map != null )
- map.set( this , value);
- else
- createMap(t, value);
- }
- ThreadLocalMap getMap(Thread t) {
- return t.threadLocals;
- }
- void createMap(Thread t, T firstValue) {
- t.threadLocals= new ThreadLocalMap( this , firstValue);
- }
使用ThreadLocal过程: 对于每一个需要线程保存自身实例的变量,需要定义一个静态的ThreadLocal实例。然后将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象。
此外,每个线程保存的自身数据并不是通过备份或复制的,而是new创建出来的。
通过ThreadLocal各个线程只能获取自身对应的数据,不能访问其他线程的数据,但是如果两个线程在set时引用了同一个数据,仍然存在同步问题
- java多线程模式ThreadLocal原理简述及其使用详解
- java多线程模式ThreadLocal原理简述及其使用详解
- java多线程模式ThreadLocal原理简述及其使用详解
- 【Java多线程】ThreadLocal实现原理
- JAVA多线程系列--ThreadLocal详解
- java ThreadLocal 使用详解
- java多线程系列(六)---线程池原理及其使用
- Java Thread&Concurrency(10): 深入理解ThreadLocal及其实现原理
- 简述java.lang.ThreadLocal类
- (三) Java多线程详解之线程范围内共享变量及ThreadLocal类使用
- 多线程中的ThreadLocal 详解
- ThreadLocal原理及其实际应用
- ThreadLocal原理及其实际应用
- ThreadLocal原理及其实际应用
- ThreadLocal原理及其实际应用
- 多线程编程之ThreadLocal的使用和内在原理
- ThreadLocal原理详解
- Java多线程及其使用(一)
- java的远程debug
- Allura 简介
- eclipse如何在线安装maven3插件
- unp笔记五 udp编程
- w3c系列CSS之路(五):详解visual formatting model
- java多线程模式ThreadLocal原理简述及其使用详解
- Ambari
- Java初学习-Iterator(迭代器)的一般用法
- android 长按home 后台运行历史
- c++基础学习10-c++的继承
- ARM-Linux嵌入式系统启动流程
- Any23 简介
- 三角形类
- 函数指针数组