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



我得到了一些代码,其中包含一些使用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被称为:这确保我得到一个实例,对应于当前运行的线程。

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

附加信息-这是一个处理许多并发http请求的web应用程序,每个http请求使用发出的类

线程安全是关于共享状态的。如果你的类没有任何状态可以在线程之间共享,你就不需要担心线程安全。

所以,如果你的类没有字段,你可以安全地在多个线程(单例)之间共享同一个类的实例,或者甚至让它的所有方法都是static(就像它经常为各种实用程序类所做的那样)。

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

最新更新