您的位置:首页 > 编程语言 > Java开发

ThreadLocalTest

2015-08-26 17:19 471 查看
<pre name="code" class="java">package com.xianfeng.common.testThreadLocal;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;

public class ThreadLocalTest {

static ThreadLocal<List> lsit0 = new ThreadLocal<List>(){
@Override
protected List initialValue() {
System.out.println(Thread.currentThread().getName()+"initialValue");
return new ArrayList();
}
};
public void run(){
Thread[] runs = new Thread[3];
T1 t=new T1(0);
for(int i=0;i<runs.length;i++){
t.set(i);
runs[i]=new Thread(t);
}
for(int i=0;i<runs.length;i++){
runs[i].start();
}
}
public static class T1 implements Runnable{
int id;
public T1(int id0){
id = id0;
}
public void  set(int i){
id=i;
}
//
//List t1 = new ArrayList(); //①测试,出现数据错乱。说明变量
//ThreadLocal<List> t1=lsit0;//②测试
public void run() {
System.out.println(Thread.currentThread().getName()+":start");
List t1 = new ArrayList(); //③测试,出现数据错乱。说明变量
for(int i=0;i<5;i++){
try{
if (Thread.currentThread().getName().equals("Thread-0")) {
Thread.sleep(100);
}else if(Thread.currentThread().getName().equals("Thread-1")) {
Thread.sleep(300);
}else {
Thread.sleep(700);
}
}catch(Exception ex){
}
t1.add(i+"=="+(i+id*100));//①③公用
//t1.get().add(i+"=="+(i+id*100)); //②
}
System.out.println(Thread.currentThread().getName()+':'+t1); //①③公用
//System.out.println(Thread.currentThread().getName()+':'+t1.get()); //②
}
}
/**
* Main
* @param args
*/
public static void main(String[] args){
ThreadLocalTest test = new ThreadLocalTest();
test.run();
}
}


先用①直接运行,(即运行代码①)再注释①用②测试,再注释①,②,用③代码测试。

①输出结果

Thread-1:start

Thread-2:start

Thread-0:[0==200, 1==201, 0==200, 2==202, 3==203, 4==204]

Thread-1:[0==200, 1==201, 0==200, 2==202, 3==203, 4==204, 1==201, 0==200, 2==202, 3==203, 1==201, 4==204]

Thread-2:[0==200, 1==201, 0==200, 2==202, 3==203, 4==204, 1==201, 0==200, 2==202, 3==203, 1==201, 4==204, 2==202, 3==203, 4==204]

②的输出结果

Thread-0:start

Thread-2:start

Thread-1:start

Thread-0initialValue

Thread-1initialValue

Thread-0:[0==200, 1==201, 2==202, 3==203, 4==204]

Thread-2initialValue

Thread-1:[0==200, 1==201, 2==202, 3==203, 4==204]

Thread-2:[0==200, 1==201, 2==202, 3==203, 4==204]

③的输出结果

Thread-0:start

Thread-1:start

Thread-2:start

Thread-0:[0==200, 1==201, 2==202, 3==203, 4==204]

Thread-1:[0==200, 1==201, 2==202, 3==203, 4==204]

Thread-2:[0==200, 1==201, 2==202, 3==203, 4==204]

①和②对比可以发现,除了ThreadLocal 变量 ,其他的变量 线程间都是共享的,因此线程间不是安全的数据,就需要将此数据装入到ThreadLocal 变量里。

②和③对比说明了什么?是不是就像在一个类中初始化了三个内部类,内部类可以共同操作外部类的变量,但内部类的变量是彼此独立(联想每个代码片段

都是有自己数据存储空间的,没求证过,可能现实就是这样。)

为了解决并发的问题,处理把不是线程安全的数据放入到ThreadLocal里,(以空间换时间,)还有就是把run()方法的代码加上锁(以空间换时间),这个线程不执行完成,其他线程

就等待,由于是一个类的多个线程,这个锁对象肯定就是一个了,一个线程的锁不释放,其他的线程就一直处理等待的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java