首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ThreadLocal了解

2012-10-15 
ThreadLocal理解刚开始看ThreadLocal的JDK文档时还有点迷茫。“该类提供了线程局部 (thread-local) 变量”,这

ThreadLocal理解

刚开始看ThreadLocal的JDK文档时还有点迷茫。“该类提供了线程局部 (thread-local) 变量”,这句话是什么意思呢?想了半天也不明白(比较笨啊)。

首先,谈谈我最初的理解,我以为是将一个变量(当然是mutable的)通过set()方法放到ThreadLocal里,然后在其它的线程中通过get()方法拿出来,在此线程中对变量所做的操作不会影响到其它线程。(很白痴的理解!!)

当时通过运行多线程后,还是会出现线程间互相影响的现象。难道是文档描述错了?肯定不是的噻!那就是我自己理解错了。

google了一下,哎!这里我要抱怨一下了,一篇同样的文章居然被N多个网站分享,有意思吗?浪费搜索资源。

终于找到答案了,原来是这样滴!就是针对每个线程都建立一个新的变量啦!通过initialValue()方法可以做到。调用ThreadLocal的get()方法时,它会获取当前线程,然后将当前线程作为key去查找一个变量,这就是“线程局部变量”。

看俺的代码就知道了:

import java.util.ArrayList;
import java.util.List;


public class TestThreadLocal {
??? private ThreadLocal<Entity> local = new ThreadLocal<Entity>(){

??? ??? @Override
??? ??? protected Entity initialValue() {
??? ??? ??? return new Entity();
??? ??? }

??? ???
??? };
???
??? public void setName(){
??? ??? Entity e = this.local.get();
??? ??? e.setName(Thread.currentThread().getName());
??? ??? if(!e.getName().equals(Thread.currentThread().getName()))
??? ??? ??? System.out.println(Thread.currentThread().getName() +":" + e.getName());
??? }
???
??? public static void main(String[] args) {
??? ??? TestThreadLocal local = new TestThreadLocal();
??? ??? int sum = 100000;
??? ??? List<Thread> list = new ArrayList<Thread>(sum);
??? ??? for(int i = 0;i < sum; i++) {
??? ??? ??? list.add(new Thread(new Test(local)));
??? ??? }
??? ??? for(Thread t: list) {
??? ??? ??? t.start();
??? ??? }
??? }
???
??? private static class Entity {
??? ???
??? ??? String name;

??? ??? public String getName() {
??? ??? ??? return name;
??? ??? }

??? ??? public void setName(String name) {
??? ??? ??? this.name = name;
??? ??? }
??? ???
??? }
???
??? private static class Test implements Runnable {
??? ??? TestThreadLocal e;
??? ??? public Test(TestThreadLocal e) {
??? ??? ??? this.e = e;
??? ??? }
??? ???
??? ??? @Override
??? ??? public void run() {
??? ??? ??? this.e.setName();
??? ??? }
??? ???
??? }
???
}

热点排行