【问题标题】:Spring : Is this member variable thread-safe?Spring:这个成员变量是线程安全的吗?
【发布时间】:2014-01-19 12:58:02
【问题描述】:
@Service    
public class InfoService {
    private Info currentInfo;

    public void initInfo(String data) {
        currentInfo = new Info(data);
    }

    //blarblar...
}

如果这不是线程安全的,我的服务方法应该更改为将“currentInfo”作为其参数。 我不想制作重复的参数代码,所以我把它作为服务的成员变量。 当然,这段代码在我身上运行得很好,但我担心这可能会造成线程危险。

“currentInfo”可能是线程危险的?

【问题讨论】:

  • 在我们担心它是线程安全之前,让我们先担心它的编译...
  • 忽略这甚至不会编译,不知道使用模式或具体问题,这是不可能回答的。按原样,您的私有变量不是volatile,因此就安全发布而言,这肯定不是“线程安全的”。我强烈建议拿起一份Java Concurrency in Practice
  • 我认为这取决于您的服务是否是单例的,如果它是单例的,那么多个线程可以访问 currentInfo 但它不是单例的,那么如果我错了,只有来自这个对象的线程使用这个变量来纠正我

标签: java spring thread-safety


【解决方案1】:

初始化后你会有这个类的单例实例,现在想象两个线程都引用了这个对象,

thread-1: 设置 currentInfo 并开始基于它计算一些东西(我假设你在其他计算中使用它和你的//blarblar...

thread-2: thred-1 开始使用它同时 thread-2 重置它

【讨论】:

  • 一般有状态的共享可变对象是线程不安全代码的标志
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2018-12-24
  • 2011-01-28
  • 2011-08-03
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多