0

环境:弹簧容器

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

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

        return list;
    }
}

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

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

4

2 回答 2

0

方法中的所有内容

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

    return list;
}

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

不存在同步问题。

于 2013-09-10T14:58:38.350 回答
0

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

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

这类似于我的一个问题。Spring MVC 控制器是单例的吗? 请查看 Tomasz 在答案中发布的关于 servlet 中的线程安全的链接。

于 2013-10-28T07:07:00.763 回答