弹簧注射 - 螺纹安全

时间:2011-02-15 10:55:09

标签: java spring dependency-injection thread-safety

public class Test{
private First first;
private Second second;

public void setFirst(First first){
this.first = first;
}
public First getFirst(){
 return first;
}
// same approach for second
}

如果我通过弹簧注射注入实例,它是否是线程安全的?如果没有,如何使其线程安全?我用谷歌搜索并发现矛盾的回答,无法得出任何结论。请建议。 提前致谢。 -RW

3 个答案:

答案 0 :(得分:7)

如果你在谈论我认为你在谈论的内容,那么这是一个有趣的讨论。

从技术上讲,因为setFirst()getFirst()不是synchronized,那么注入setFirst()可能线程1上的一个对象,以及getFirst()在线程2上返回一个不同的对象。正如他们所说,Java内存模型保留使其“最终保持一致”的权利。

因此,在启动期间(或服务器的内部启动线程)配置其bean图的Spring的情况下,由于缺少,因此HTTP请求线程(例如)可能无法正确地看到该bean图。同步。

注意:这与并发访问无关。即使在Spring初始化之后HTTP请求进入,Java内存模型也不能保证这些线程会看到正确的数据。

在实践中,这种情况从未发生过(至少,我从未见过它)。缺少同步只是并发线程的一个问题,这不是问题。

所以这只是一个学术论点。

如果不是你在谈论什么,我道歉。不过,这仍然是一个有趣的想法。

答案 1 :(得分:0)

依赖项的注入由Spring处理,你不应该关心getter和setter的线程安全性,因为Spring会考虑到你没有同步逻辑而注入依赖项。

此外,在完全配置上下文并注入所有依赖项之前,没有其他线程(即应用​​程序的线程)将使用bean。

你不应该担心依赖注入的线程安全性,Spring会这样做(很可能,spring只使用一个线程来注入所有依赖项)。

答案 2 :(得分:-1)

假设您已经创建了Test的单例实例,并尝试从您的程序的另一部分设置/获取Spring(b)中的值(a)。 在这种情况下,只需使您的get / set对同步:

public synchronized void setFirst(First first){
    this.first = first;
}
public synchronized First getFirst(){
    return first;
}

我没有看到多线程的其他不安全感