对ThreadLocal的一些见解
ThreadLocal在不同的进程中有独立的对象,不相互影响,在get的时候取的是初始化时重写initialValue() 返回的方法(只在没有运行过set()时),目前发现特点:
1.只用初始化一次,只要初始化过一次,在其他线程中将不用初始化。
若在主线程中声明了一个ThreadLocal(没有new),并且在某个子线程中初始化(即new),那么在另外一个子线程将不用再初始化。不过不推荐,因为若第一次运行的子线程不是包含初始化的线程,会报空指针异常。
2.在不同的线程中拥有独立的对象,不相互影响。
例如在主线程中声明并初始化了一个ThreadLocal对象:
threadLocal = new ThreadLocal()
{
@Override
protected Object initialValue() {
return 5;
}
};
那么在子线程1中调用并set进去行的对象:
Runnable runnable1 = new Runnable() {
@Override
public void run() {
int temp = Integer.parseInt(threadLocal.get().toString());
temp +=1;
threadLocal.set(temp);//把6set进去
}
};
之后再另一个子线程中取出时,对象独立不受影响:
Runnable runnable2 = new Runnable() {
@Override
public void run() {
int temp = Integer.parseInt(threadLocal.get().toString());
Log.i("num",temp);//取出来的仍为5,而不是6
}
};