java - java中ThreadLocal变量如何将其对象的副本传递给不同的线程?

标签 java thread-local

下面是创建线程局部变量的示例

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/

相关文章:

java - 如何在android中使用post数据调用webservice

java - 最小化多线程环境中的 SecureRandom 性能问题?

multithreading - Spring Security : same SecurityContext-instance in multiple ThreadLocals, 是如何工作的?

java - 使用 ThreadLocals 的 Akka 和 Java 库

c++ - C++ 编译器如何在 C++0x 中实现线程本地存储?

java - 当我的 Java 应用程序退出/崩溃时,如何摆脱 Java 子进程?

java - 如何从 Excel 文件中提取外部引用列表

java - Java 属性文件的良好存储库组织实践

java - 如何从文本字符串中删除字符

java - 如果我在工厂类中实现 ThreadLocal 会发生什么