gpt4 book ai didi

java - java中的单例类或实例

转载 作者:行者123 更新时间:2023-11-29 05:13:08 24 4
gpt4 key购买 nike

我了解到在Spring框架中,bean的默认作用域是Singleton。这意味着每个容器只创建一个 bean 实例。

但我实际上无法理解下面的场景。

例如类,假设类“SingleTonClass”在 spring context.xml 中配置为单例 bean,1)每次有对此类的请求时,它是否使用相同的实例。如果是,那么如果我从另一个类调用 new SingleTonClass().sum(3,4)new SingleTonClass().sum(5,6) ,会给我正确的结果还是有时会有问题?

2) 如果所有请求都使用同一个实例,那么在幕后如何可能所有请求只使用一个实例?如果对同一个单例类有 100 个请求,每个请求都必须等到前一个请求完成?

编辑:

假设我使用的是@Autowired 而不是新运算符

在我的主类中,我尝试使用使用 spring 配置的 bean。假设 MyMain 被多次调用(可能是也可能不是并发调用),我想了解上面帖子中的第 2 点(编辑)

public class MyMain() {

@Autowired
SingleTonClass singleTonClass;

}




public class SingleTonClass {

private int a=0;
private int b=0;

public int sum(int a ,int b) {

return a+b;
}
}

最佳答案

1) 如果您依靠 Spring 来管理您的 bean,并且正如您所说,使用默认的单例范围,那么其他 bean 将使用相同的实例。但是,如果您自己实例化类(例如使用 new),那么每次都会有一个类的新实例。

2) 如果你有 100 个并发请求,那么就会有 100 个线程,所有线程都可以同时调用你的类而不会阻塞。也就是说,您可以使线程相互等待(例如通过使用 synchronized 或任何 Lock 类)。自然地,性能会受到影响,因为现在有 99 个线程在等待。您更喜欢这种解决方案的唯一原因是您的 bean 是否具有共享的、可变的状态,而这是我反对的。沿着这些线,您可以从示例中删除实例变量 ab。毕竟,它们并没有被使用,因为 ab 都作为方法参数传递:

public class SingleTonClass {

public int sum(int a ,int b) {
return a+b;
}
}

关于java - java中的单例类或实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27576025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com