Java多线程总结之由synchronized说开去(三)

2014-11-24 01:22:40 · 作者: · 浏览: 1

t1.start();
t2.start();
}

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变量
student.setAge(age);
System.out.println("thread "+currentThreadName+" first read age is:"+student.getAge());
try {
Thread.sleep(5000);
}
catch(InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("thread "+currentThreadName +" second read age is:"+student.getAge());

}

protected Student getStudent() {
Student student = (Student)studentLocal.get(); //从ThreadLocal对象中取
if(student == null) {
student = new Student();
studentLocal.set(student); //如果没有就创建一个
}
return student;
}

protected void setStudent(Student student) {
studentLocal.set(student); //放入ThreadLocal对象中
}
}

ThreadLocal通过一个Map来为每个线程都持有一个变量副本,用ThreadLocal对象以键值对的方式来维护这些线程独立变量 。