2013年3月4日星期一

神奇的ThreadLocal


import java.util.*;
/**
简单的测试类,测试ThreadLocal如何使用,及和普通变量的区别
测试 方法
javac ThreadLocalTest.java
java ThreadLocalTest
**/
public class ThreadLocalTest {
public static void main(String args[]){
   //启动4个线程测试MyThreadLocal中变量tl和num的变化
   MyThreadLocal mt = new MyThreadLocal();
   MyThread t1 = new MyThread(mt);
   MyThread t2 = new MyThread(mt);
   MyThread t3 = new MyThread(mt);
   MyThread t4 = new MyThread(mt);
   t1.start();
   t2.start();
   t3.start();
   t4.start();
}
}
class MyThread extends Thread
{
private MyThreadLocal user ;
public MyThread(MyThreadLocal para){
   user = para;
}
public void run(){
   for(int i=0;i<3;i++){
    System.out.println(Thread.currentThread().getName()+"\t"+user.getNext()+"\t"+user.getNextNum());
   }
}
}

class MyThreadLocal
{
private ThreadLocal<Integer> tl = new ThreadLocal<Integer>(){
    protected Integer initialValue() {
     return 0;
    }
};
private Integer num = 0;
public Integer getNext(){
   tl.set(tl.get()+1);
   return tl.get();
}
public Integer getNextNum(){
   num = num+1;
   return num;
}
}
//自己实现的ThreadLocal
class SimpleThreadLocal {
    private Map valueMap = Collections.synchronizedMap(new HashMap());
    public void set(Object newValue) {
        valueMap.put(Thread.currentThread(), newValue);
    }
    public Object get() {
        Thread currentThread = Thread.currentThread();
        Object o = valueMap.get(currentThread);
        if (o == null && !valueMap.containsKey(currentThread)) {
            o = initialValue();
            valueMap.put(currentThread, o);
        }
        return o;
    }
    public void remove() {
        valueMap.remove(Thread.currentThread());
    }
    public Object initialValue() {
        return null;
    }
}

没有评论:

发表评论