我得到了一些代码,其中包含一些使用 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/