java - 当不存在共享对象时使用ThreadLocal

标签 java multithreading concurrency thread-local

我得到了一些代码,其中包含一些使用 TheadLocal 的类.

这是一个示例实现:

public class MyClass {

    public MyClass() {
    }


    // Class methods..


    private static ThreadLocal<MyClass> factoryCache = new ThreadLocal<MyClass>() {
    public synchronized MyClass initialValue() {
        return new MyClass();
    }

    public synchronized MyClass get() {
        return super.get();
    }

    public synchronized void set(MyClass value) {
        super.set(value);
    }
    };

    public static MyClass get() {
    return factoryCache.get();
    }
}

请注意,为了使用该类,需要调用静态 getter:MyClass.get(); 这确保我获得与当前正在运行的线程相对应的实例。

我的问题 - 这个类不包含成员或静态变量,这意味着类级别没有共享对象。在这种情况下 - 我想知道这里使用 ThreadLocal 是否有任何优势。假设我使用这个类作为单例(删除ThreadLocal部分),每个线程在进入方法时都会创建自己的堆栈(对吗?),那么在这种情况下使用ThreadLocal还有意义吗?

附加信息 - 这是一个处理许多并发 http 请求的 Web 应用程序,并且每个 http 请求都使用发布的类。

最佳答案

线程安全与共享状态有关。如果您的类没有任何可在线程之间共享的状态,则无需担心线程安全。

因此,如果您的类没有字段,您可以安全地在多个线程(单例)之间共享该类的同一个实例,甚至可以将其所有方法设为静态(就像通常对各种线程所做的那样)实用程序类)。

这不会造成任何问题,因为正如您所正确指出的,每个线程都有自己的堆栈,因此局部变量不能以任何方式在线程之间共享。

关于java - 当不存在共享对象时使用ThreadLocal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339080/

相关文章:

java - MVVM-我应该在哪里调用用户位置?

java - Java 可以处理多少个音频片段?

c++ - C++中的线程问题

debugging - 如何使用 gdb debug golang 代码查看 channel 内的内容?

java - Java 中的 lambda 表达式如何工作?

java - 如何使用java阅读电子邮件?

Java多态性-从父映射获取子命令

python 多线程使用 fcntl flcok 处理文件

python - 在 Python 线程化过程中更新 Tkinter 标签

java - 如何为Executors.newScheduledThreadPool设置RemoveOnCancelPolicy(5)