java面试300问1、ThreadLocal有什么作用

ThreadLocal是线程用来维护和隔离数据用的容器。

每一个线程都可以通过ThreadLocal来维护一些变量。

通过get方法获得变量,通过Set方法刷新变量。

这些变量互不影响。

举例如下

//初始化

private final static ThreadLocal<Student> localdata = new ThreadLocal<Student>();

//获取数据

Student student = localdata.get();

//存储数据

student = new Student(new Random().nextInt(30)+10);
localdata.set(student);

实际上ThreadLocal 是基于Map的封装,由于每个线程名称不一样,所以Map的key 不一样,因此即使调用set/get方法,也能独立操作每个线程里的数据互不影响。

给出例子如下

//app.java

public class App {

public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadLocalService service = new ThreadLocalService();
Thread t1 = new Thread(service,"thread1");
Thread t2 = new Thread(service,"thread2");
t1.start();
t2.start();
}

}

//ThreadLocalService.java

public class ThreadLocalService implements Runnable {

private final static ThreadLocal<Student> localdata = new ThreadLocal<Student>();
@Override
public void run() {
// TODO Auto-generated method stub
Student student = localdata.get();

try {

if (null==student) {
student = new Student(new Random().nextInt(30)+10);
localdata.set(student);
}
System.out.println(Thread.currentThread().getName() +">000ms>age = "+student.getAge());
Thread.sleep(500);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//student = localdata.get();
System.out.println(Thread.currentThread().getName() +">500ms>age = "+student.getAge());
}

}

运行结果

thread1>000ms>age = 17
thread2>000ms>age = 27
thread2>500ms>age = 27
thread1>500ms>age = 17

 

本案列代码下载科技解决方案吧

https://idea.techidea8.com/open/idea.shtml?id=4

本文由 互联网解决方案 作者:奋斗士小西 发表,其版权均为 互联网解决方案 所有,文章内容系作者个人观点,不代表 互联网解决方案 对观点赞同或支持。如需转载,请注明文章来源。

发表评论