【问题标题】:Are method level singleton instances Thread safe?方法级单例实例线程安全吗?
【发布时间】:2012-09-05 18:19:36
【问题描述】:

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

    }
}

【问题讨论】:

  • 如果它是一个单例(这取决于你在春季如何定义它),那么这绝不是线程安全的。你当然可以做一个测试和检查

标签: java multithreading thread-safety singleton


【解决方案1】:

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

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

【讨论】:

  • 很好奇 - 这是否仅适用于单例局部变量?即 - 如果 SomeObject 不是单例。那么这会是线程安全的吗?
  • 如果SomeObject 被多个线程使用,我会说它需要被保护。我不会说它不应该是一个单例,因为 Spring 默认会生成单例 bean。
  • 如果SomeObject 是按线程创建的,就像ThreadLocal 一样,那么您将是线程安全的@Preator。它是关于多个线程是否使用同一个对象。
  • @PreatorDarmatheon:这完全取决于你如何获取它。基本上,如果您有多个线程可以不受限制地访问一个对象,那么该对象最好是线程安全的......
  • @Gray:在这种情况下,您所说的“受保护”是什么意思?如果您的意思是它应该被设计为同时从多个线程中使用,那么您并没有不同意我的回答。
【解决方案2】:

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

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

【讨论】:

  • 它不必是不可变的 - doSomething 可能不是同步方法,但它仍然可以在内部同步,或者它可能会改变 AtomicInteger 等。
  • class SomeObject { // 不同步 public void doSomething() { int x;所以我猜这将是线程安全的? (没有类级变量)
  • 再次取决于SomeObject@Preator 的其余代码。如果您处理的只是堆栈上的本地计算,那么是的,这将是线程安全的。
【解决方案3】:

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

如果 Object 是全局分配而不是线程本地分配的,您将获得相同的线程安全效果。

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

private SomeObject getSomeObject() {
    // returns singleton
    SpringContext.getBean("someObject");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2011-01-13
    • 2021-05-12
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多