java - 单例 Bean 如何服务并发请求?

标签 java multithreading spring concurrency multiprocessing

我有一个关于单例 bean 如何详细处理并发请求的问题。

我在 StackOverflow 上搜索过这个问题。这是一个样本 link from stackoverflow ,但我发现只有高级别的细节。我想要关于单例 bean 如何处理并发请求以及系统处理器如何查看这些请求的完整详细信息。

我在线研究了系统处理器中的并发请求处理。他们说处理器本身有一个调度器,调度器将决定处理哪个请求。

好的。如果假设我有多个核心处理器,调度器如何处理并发请求?

谁能向我解释一下单例 bean 如何在 JVM 和系统中为并发请求提供服务的分步过程?

让我用一个具体的例子来解释。我有一个像 Sports 这样的类(class):

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

有两个请求进来。第一个请求是在 Sports 类的已创建单例实例上执行 playFootball 方法。同时,另一个请求正在对 Sports 类的同一个已创建单例实例执行 playVolleyBall 方法。

单例实例怎么可能?

最佳答案

萨拉万·库马尔,

我了解您提出问题的动机。在我开始研究编译器之前,我也有一个非常相似的想了解 Java 虚拟机的内部结构。

首先,我对你的问题印象深刻。为了解决您的问题,需要有几点区别和理解。首先:单例模式,有时甚至称为反模式,确保只有一个此类的实例可用于 JVM(Java 虚拟机)。这意味着我们本质上是将全局状态引入应用程序。我知道你明白这一点,但这只是一个澄清点。

现在是内部结构。

当我们创建一个类的实例时,我们正在创建一个驻留在 JVM 共享内存中的对象。现在,这些线程正在独立执行对这些实例进行操作的代码。每个线程都有一个工作内存,它保存所有线程之间共享的主内存中的数据。这是对您创建的 Singleton 对象的引用所在的位置。本质上,正在发生的事情是生成的代表您创建的单例对象的字节码正在这些线程中的每一个线程上执行。

现在内部情况如下:

每个 JVM 线程都有一个私有(private) JVM 堆栈,与线程同时创建。现在,JVM 有一个在所有 JVM 线程之间共享的堆。堆是为所有类实例和数组分配内存的运行时数据区域。堆是在 VM 启动时创建的。当您的线程请求单例实例时,它将指向此单例的字节码所在的堆中的引用。它将执行适当的代码。在您的情况下,它将为第一个请求执行第一个方法,为第二个请求执行第二个方法。它能够这样做是因为没有锁或限制阻止编译器将程序计数器指向堆中分配此实例的区域。 Singleton 类对 Java 虚拟机的唯一限制是它在该类的堆中只能有一个实例。就是这样。除此之外,您可以从您的方法中引用它 100 次,编译器将指向相同的字节码并简单地执行它。这就是为什么我们通常希望 Singleton 类是无状态的,因为如果我们有任何线程访问它,我们不希望内部变量因为缺乏并发控制而发生变异。

如果您有任何问题,请告诉我!

关于java - 单例 Bean 如何服务并发请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25617962/

相关文章:

java - namedParameterJdbctemplate 更新,包含多个要更新的字段

java - Spring WS DefaultWsdl11定义错误

java - 为什么这里不需要显式转换?

java - 原始实时数据包中的 NSL KDD 功能?

Java TCP重传超时

java - Android SDK - 在后台运行功能

java - 相同的无状态 session bean 在同一应用程序中工作不同

.net - Observables vs Tasks - 首选实现?

python - 限制python中的线程数量

java - 编写一个带有构造函数的 spring bean,该构造函数包含属性文件中的值列表