【问题标题】:Spring service layer scoped as Singleton - is it thread safe?范围为 Singleton 的 Spring 服务层 - 它是线程安全的吗?
【发布时间】:2013-09-10 14:35:40
【问题描述】:

环境:Spring 容器

假设我将服务层配置为Singleton,并且服务类中没有实例变量(状态变量)。

@Singleton
class MyService{
    public List<String> getNames(){
        List<String> list = entityManager.createQuery("");
        list.add("uknown");

        return list;
    }
}

如果有多个请求(多个线程)试图同时访问方法getNames(),是否可能有任何同步问题?

例如,请求是否可以返回两次“uknown”名称?

【问题讨论】:

  • //服务类中没有实例变量(状态变量)。 entityManager 呢?

标签: spring thread-safety singleton service-layer


【解决方案1】:

方法中的一切

public List<String> getNames(){
    List<String> list = entityManager.createQuery("");
    list.add("uknown");

    return list;
}

的范围是请求。 entityManager 调用返回一个新的List 实例,您可以在其中添加一个新的String。然后,您返回该列表。只有调用该方法的线程才能访问该 List 实例(除非您稍后共享它)。

没有同步问题。

【讨论】:

    【解决方案2】:

    由于服务类在此处不保存任何状态(在您的示例中,服务类中没有实例变量),因此您的服务是安全的。局部变量和参数对于线程来说是本地的(驻留在堆栈上,而不是在堆上)。

    如果您的服务中有其他对象,例如 userProfile,那么由于这些对象依赖于每个请求,因此这些对象需要限定为原型。否则,此服务是安全的。

    这类似于我的一个问题。 Are Spring MVC Controllers Singletons? 请查看 Tomasz 在答案中发布的关于 servlet 中的线程安全的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多