ThreadLocal
key value
thread1 aaa
thread2 bbb
thread3 ccc
1 ThreadLocal API
ThreadLocal类只有三个方法:
void set(T value):保存值;
T get():获取值;
void remove():移除值。
2 ThreadLocal的内部是Map
ThreadLocal内部其实是个Map来保存数据。虽然在使用ThreadLocal时只给出了值,没有给出键,其实它内部使用了当前线程做为键。
Threadlocal的简单使用1
@Test
public void fun(){
/*
* Threadlocal类:
* 在多个线程进行对共享资源访问时,可能会出现并发问题
* Threadlocal类使每一个线程都有共享资源的副本数据,避免多线程操作时产生问题。
*/
ThreadLocal<String> local = new ThreadLocal<String>();
local.set("haha");
System.out.println(local.get());
local.remove();
}
Threadlocal的核心源码
class MyThreadLocal <T>
{
/*
* Threadlocal源码分析:底层其实是map容器
* 每个线程都可以存储一个自定义类型的数据,各个线程互不干涉
* 在构造器中可以传入要存储的参数类型
*
*/
private Map<Thread,T> map = new HashMap<Thread, T>();
public void set (T data){
map.put(Thread.currentThread(), data);
}
public void remove(){
map.remove(Thread.currentThread());
}
public T get(){
return map.get(Thread.currentThread());
}
}
Threadlocal的测试
@Test
public void fun2(){
final ThreadLocal<String> local = new ThreadLocal<String>();
local.set("我是"+Thread.currentThread().getName()+"设置的值");
new Thread(){
public void run(){
System.out.println(Thread.currentThread().getName()+"线程开始获取了"+local.get());
}
}.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("外部线程开始获取了"+local.get());
控制台输出:
Thread-0线程开始获取了null
外部线程开始获取了我是main设置的值
}
可以看出,map的key是当前线程的名字,只有通过当前线程调用方法隐式传入了线程的名字才能取出存储的值