obj下面的操作是否安全?我知道方法级别的变量和实例会在每个线程的堆栈上发生 - 但我不确定当局部变量是单例时会发生什么。在webservice调用中调用foo()。我很好奇这是否是线程安全的?
public void foo() {
SomeObject obj = getSomeObject();
obj.doSomething(); // Would this be thread safe?
}
private SomeObject getSomeObject() {
// returns singleton
SpringContext.getBean("someObject");
}
class SomeObject {
int x;
...
// Not synchronized
public void doSomething() {
}
}
答案 0 :(得分:6)
这取决于“线程安全”的含义。如果SomeObject.doSomething()
以不安全的方式改变实例,那么不,它不安全。两个不同的线程可以获得对同一对象的引用。
基本上,除非SomeObject
被设计为同时从多个线程使用,否则你不应该将它作为单例。
答案 1 :(得分:4)
仅当SomeObject
本身是线程安全的时候才是线程安全的。例如,如果您阅读并且可以更改x
调用中doSomething()
的值,则除非已正确锁定,否则它将不是线程安全的。
在不了解SomeObject
的情况下,无法准确判断出您是否会遇到问题。
答案 2 :(得分:0)
进行任何静态引用时,方法/线程局部性可能会完全丢失。由于引用是静态的,指向静态引用的本地字段不在线程堆栈上,实际上它可能被其他线程引用。
如果对象是全局分配而不是线程局部分配,则具有相同的线程安全效果。
final SomeObject obj = getSomeObject();
public void foo() {
obj.doSomething();
}
private SomeObject getSomeObject() {
// returns singleton
SpringContext.getBean("someObject");
}