ThreadLocal : 每个线程中保留一份自己的变量副本,避免引起数据同步问题。代码如下:
public class Student {
private int age=0;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadLocalDemo implements Runnable {
private static final ThreadLocal studentLocal = new ThreadLocal();
public static void main(String args[]) {
ThreadLocalDemo td = new ThreadLocalDemo();
Thread t1 = new Thread(td,"a");
Thread t2 = new Thread(td,"b");
t1.start();
t2.start();
}
@Override
public void run() {
accessStudent();
}
public void accessStudent() {
String currentThreadName = Thread.currentThread().getName();
System.out.println(currentThreadName + " is running!");
Random random = new Random();
int age = random.nextInt(100);
System.out.println("thread "+currentThreadName + " set age to: "+age);
Student student = getStudent();
student.setAge(age);
System.out.println("thread "+currentThreadName +" first read age is: "+student.getAge());
try {
Thread.sleep(500);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("thread "+currentThreadName+" second read age is: "+student.getAge());
}
protected Student getStudent() {
Student student = (Student) studentLocal.get();
if(student==null) {
student = new Student();
studentLocal.set(student);
}
return student;
}
//简单实现
/*public class ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());
public Object get() {
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if(o==null&&!values.containsKey(curThread)) {
o = initialValue();
values.put(curThread,o);
}
return o;
}
public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}
public Object initialValue() {
return null;
}
}*/
}