一.ThreadLocal是什么
JDK 1.2的版本中就提供java.lang.ThreadLocal,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal 数据的存储是使用了其静态内部类:ThreadLocalMap来存储数据。针对每个thread保留一个entry,如果对应的thread不存在则会调用initialValue。
ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:
- void set(Object value)设置当前线程的线程局部变量的值。
- public Object get()该方法返回当前线程所对应的线程局部变量。
- public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
二.例子
package test1; import java.util.HashMap; public class TreadLocalTest { static ThreadLocal<HashMap<Integer,Object>> TESTVAR = new ThreadLocal<HashMap<Integer,Object>>(){ @Override protected HashMap<Integer,Object> initialValue() { System.out.println(Thread.currentThread().getName()+"initialValue"); return new HashMap<Integer,Object>(); } }; public static void main(String[] args){ Thread[] runs = new Thread[3]; for(int i=0;i<runs.length;i++){ runs[i]=new Thread(new TestTread(i)); } for(int i=0;i<runs.length;i++){ runs[i].start(); } } } class TestTread implements Runnable{ int thredNum; public TestTread(int thredNum){ this.thredNum = thredNum; } public void run() { System.out.println(Thread.currentThread().getName()+":start"); HashMap<Integer,Object> map = TreadLocalTest.TESTVAR.get(); for(int i=0;i<10;i++){ map.put(i, i+thredNum*10); try{ Thread.sleep(100); }catch(Exception ex){ } } System.out.println(Thread.currentThread().getName()+':'+map); } }
相关推荐
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
NULL 博文链接:https://aty.iteye.com/blog/1913734
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
正确理解ThreadLocal.pdf
ThreadLocal深度理解
ThreadLocal的简单理解.doc
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量
Java中ThreadLocal工具类(解决多线程程序中并发问题的一种新思路,主要为参数的拷贝问题),感兴趣的话可以查看博文,博文地址:http://blog.csdn.net/otengyue/article/details/38459327
主要介绍了Android 中ThreadLocal的深入理解的相关资料,希望通过本文能帮助到大家,让大家理解应用ThreadLocal,需要的朋友可以参考下
并且由于每个线程在访问该变量时,读取和修改的,都是独有的那份变量拷贝,变量被彻底封闭在每个访问的线程中,并发错误出现的可能也完全消除了。} catch (SQL
主要介绍了彻底理解Java 中的ThreadLocal的相关资料,需要的朋友可以参考下
主要介绍了深入理解ThreadLocal工作原理及使用示例,涉及ThreadLocal<T> 简介和使用示例及ThreadLocal的原理等相关内容,具有一定参考价值,需要的朋友可以了解下。
ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。使用这个工具类可以很简洁地编写出优美的多线程程序。接下来通过本文给大家介绍Java中的ThreadLocal,需要的朋友可以参考下
声明仅作学习。如有不适,请告知。清晰的看到一个线程Thread中存在一个ThreadLocalMap,ThreadLocalMap中的key对应ThreadLo
ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每一个线程都会有这个变量的一个本地副本。当多线程操作这个变量时,实际操作的就是自己本地内存里面...
主要介绍了Android 中 ThreadLocal使用示例的相关资料,这里提供示例代码帮助大家学习理解这部分内容,需要的朋友可以参考下
NULL 博文链接:https://beijishiqidu.iteye.com/blog/2247342
其实,它就是一个容器,用于存放线程的局部变量,我认为应该叫做 ThreadLocalVariable(线程局部变量)才对,真不理解为什么当初 Sun 公司的工程师这样命名。 早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了...