没有共享对象时使用ThreadLocal

时间:2014-06-21 06:40:14

标签: 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的点? / p>

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

1 个答案:

答案 0 :(得分:0)

线程安全是关于共享状态的。如果您的班级没有任何状态可以在线程之间共享,那么您不必担心线程安全。

因此,如果您的类没有字段,您可以安全地在多个线程(单例)之间共享该类的相同实例,甚至可以使其所有方法static(因为它经常为各种实用工具)。

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