下面是创建线程局部变量的示例
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
还有第二种使用Thread Local的方法
public class MyThreadLocal {
public static final ThreadLocal userThreadLocal = new ThreadLocal();
public static void set(Context user) {
userThreadLocal.set(user);
}
public static void unset() {
userThreadLocal.remove();
}
public static Context get() {
return userThreadLocal.get();
}
}
现在,下面的行创建一个线程局部变量,并且它是静态的。
public static final ThreadLocal userThreadLocal = new ThreadLocal();
每当类加载到 JVM 中时,静态变量都会被初始化。这意味着当类加载时会创建一个对象。
**问题: *当不同的线程调用ThreadLocal变量的Set或get时,线程本地对象的副本如何传递给线程?*每个线程如何获取自己的对象? 如果在加载类时创建了一个对象,那么这是怎么发生的?**
最佳答案
这实际上是Thread实现的一部分。
原则上,您可以认为每个 Thread 实例都有一个 Map,其中 ThreadLocal 对象实例(只有一个)是键,与其关联的值是值。
ThreadLocal的静态实例根本不保存值,它只是一个标记,供Thread再次查找它(Thread存储值)。
所以
userThreadLocal.get();
类似于
currentThread.privateMapOfThreadLocalValues.get(userThreadLocal);
关于java - java中ThreadLocal变量如何将其对象的副本传递给不同的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18912122/