1

对 obj 以下线程的操作是否安全?我知道方法级别的变量和实例都在每个线程的堆栈上——但我不确定当局部变量是单例时会发生什么。foo() 在 web 服务调用中被调用。我很好奇这是否是线程安全的?

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() {

    }
}
4

3 回答 3

6

这取决于您所说的“线程安全”是什么意思。如果SomeObject.doSomething()以不安全的方式改变实例,那么不,它不安全。两个不同的线程可以获得对同一个对象的引用。

基本上,除非SomeObject设计为同时从多个线程中使用,否则您不应该将其设为单例。

于 2012-09-05T18:22:06.363 回答
4

只有当SomeObject它本身是线程安全的时,它才是线程安全的。例如,如果您读取并可以更改调用x中的值,doSomething()那么除非它被适当地锁定,否则它将不是线程安全的。

如果不了解更多信息SomeObject,就无法准确判断您是否会遇到问题。

于 2012-09-05T18:21:22.963 回答
0

当您进行任何静态引用时,方法/线程局部性可能会完全丢失。由于引用是静态的,指向静态引用的本地字段不在线程堆栈上,它实际上可能被其他线程引用。

如果对象是全局分配的而不是线程局部的,则您具有相同的线程安全效果。

final SomeObject obj = getSomeObject();
public void foo() {
    obj.doSomething();  
}

private SomeObject getSomeObject() {
    // returns singleton
    SpringContext.getBean("someObject");
}
于 2012-09-05T18:24:02.137 回答