繁体   English   中英

方法级别的单例实例线程安全吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM