读书人

线程学习札记【5】-ThreadLocal应用

发布时间: 2012-10-06 17:34:01 作者: rapoo

线程学习笔记【5】--ThreadLocal应用

基本的ThreadLocal使用

public class ThreadLocalTest {static ThreadLocal<MyThreadScopeData> myThreadScopeData=
new ThreadLocal<MyThreadScopeData>();public static void main(String[] args) {for(int i=0;i<2;i++){new Thread(new Runnable(){int data =new Random().nextInt();public void run() {                  MyThreadScopeData mydata=new MyThreadScopeData();                  mydata.setName("name is name"+data);                  mydata.setAge(data);                  //把对象存入ThreadLocal   这样的做法非常烂!!!!!                    myThreadScopeData.set(mydata);  
                  new B().showThreadScopeData();                }            }).start();        }    }static class B{public void showThreadScopeData(){            System.out.println(myThreadScopeData.get().getName());            System.out.println("age is "+myThreadScopeData.get().getAge());        }    }        }}

标准使用方式

/** * 单列线程 * 在线程中范围内任意地方调,得到都是同一个实例对象 * 把ThreadLocal封装到单列的内部*/class ThreadSingle{private ThreadSingle(){}public static ThreadLocal<ThreadSingle> map=new ThreadLocal<ThreadSingle>();//不需要加synchronized,即便有第2个线程进入,但拿到的map.get()是独有的。    public static ThreadSingle getThreadInstance(){  //方法得到是与本线程相关的实例         ThreadSingle obj=map.get();/**         * 如果A进入时obj=null,刚创建完还没赋值,此时B线程进入,但B和A没有关系。*/if(obj==null){                obj=new ThreadSingle();            map.set(obj);        }return obj;    }private String name;private int age;public String getName() {return name;    }public void setName(String name) {this.name = name;    }public int getAge() {return age;    }public void setAge(int age) {this.age = age;    }}

?

?

public class ThreadLocalTest {public static void main(String[] args) {for(int i=0;i<2;i++){new Thread(new Runnable(){int data =new Random().nextInt();public void run() {ThreadSingle.getThreadInstance().setName("name"+data);ThreadSingle.getThreadInstance().setAge(data);new C().showData();}}).start();}}

?

?

?

?

?

?

?

读书人网 >编程

热点推荐