[英]Are method level singleton instances Thread safe?
在obj以下线程上进行的操作安全吗? 我知道方法级别的变量和实例位于每个线程的堆栈上-但我不确定当局部变量为单例时会发生什么。 在Web服务调用中调用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() {
}
}
这取决于您所说的“线程安全”。 如果SomeObject.doSomething()
以不安全的方式SomeObject.doSomething()
实例,则否,这是不安全的。 两个不同的线程可以获得对同一对象的引用。
基本上,除非将SomeObject
设计为可同时从多个线程使用,否则不应将其设为单例。
仅当SomeObject
本身是线程安全的时,它才是线程安全的。 例如,如果您阅读并可以在doSomething()
调用中更改x
的值,那么除非将其适当锁定,否则它将不是线程安全的。
如果不了解有关SomeObject
更多信息,就不可能确切地说出您是否会遇到问题。
当您进行任何静态引用时,方法/线程局部性可能会完全丢失。 由于引用是静态的,指向静态引用的本地字段不在线程堆栈上,因此实际上其他线程可以引用它。
如果对象是全局分配的,而不是局部线程分配的,则具有相同的线程安全效果。
final SomeObject obj = getSomeObject();
public void foo() {
obj.doSomething();
}
private SomeObject getSomeObject() {
// returns singleton
SpringContext.getBean("someObject");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.