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
答案 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;
}
我没有看到多线程的其他不安全感