先简要对ThreadLocal进行一下说明,大家都知道synchronized,他是为了解决线程互斥访问临界资源的。而ThreadLocal是为了隔离临界资源(可能这里不应该叫临界资源了,应该叫被共享的资源),创建副本解决synchronized要解决的那个问题的。
看个例子先:
package com.wjy.threadlocal;
public class Student {
private int age=0;
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age=age;
}
}
package com.wjy.threadlocal;
import java.util.Random;
public class ThreadLocalDemo implements Runnable{
private final static ThreadLocal studentLocal=new ThreadLocal();
public static void main(String args[]){
ThreadLocalDemo td=new ThreadLocalDemo();
Thread t1=new Thread(td, "thread1");
Thread t2=new Thread(td, "thread2");
t1.start();
t2.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
accessStudent();
}
protected Student getStudent(){
Student student=(Student)studentLocal.get();
if(student==null){
student=new Student();
studentLocal.set(student);
}
return student;
}
public void accessStudent(){
String currentThreadName=Thread.currentThread().getName();
System.out.println("Current thread: "+currentThreadName);
Random random=new Random();
int age=random.nextInt(100);
Student student=getStudent();
student.setAge(age);
System.out.println("thread "+currentThreadName+" set age to: "+age);
System.out.println("thread "+currentThreadName+" first read age is: "+student.getAge());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread "+currentThreadName+" second read age is: "+student.getAge());
}
}
惊奇地发现,在同时被两个线程共享age的情况下,age竟然没有出现问题。两个线程运行正常,互不影响。