当前位置: 首页 > 面试题库 >

单例Bean如何处理并发请求?

谭修竹
2023-03-14
问题内容

我有一个关于单例bean如何详细处理并发请求的问题。
我想要有关单例bean如何处理并发请求以及系统处理器如何看到这些请求的完整详细信息。

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

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

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

让我用一个具体的例子来解释。我有一个像这样的课程Sports

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

有两个请求。第一个请求是playFootball在创建的class单例实例上执行该方法Sports。同时,另一个请求正在playVolleyBallclass的相同创建的单例实例执行该方法Sports。

单例实例怎么可能?


问题答案:

我了解你提出问题的动机。在开始从事编译器工作之前,我也有一个非常相似的想知道Java虚拟机内部的知识。

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

现在是内部。

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

现在,如何进行此操作的内部原理如下:

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

请让我知道,如果你有任何问题!



 类似资料:
  • 我已经参考了这些链接,但仍然怀疑对singleton bean的并发请求是另一个不太相关的链接 我的问题/疑问:并行请求是否会由一个Spring单例bean[因为这只是一个对象/实例]并行/顺序处理?@Controller,@服务甚至在多核处理器上(并行线程执行能力) 希望不是,但它是如何工作的。 从第一个链接开始,我了解了一些东西——一个singleton bean对象,这个singleton

  • 我的web应用程序使用SpringIOC。因此,默认情况下,我所有的SpringBean都是单例的。如果两个请求试图同时访问单个类的两个不同方法(例如,是一个具有两个方法的类和),那么两个请求将同时访问同一个springbean。 同一个Spring bean如何同时对两个客户端可用,或者当两个请求都试图通过同一个Spring bean访问两个不同的方法时,这将是并发问题。由于Spring bea

  • 并发请求处理 我创建了一个服务器,并使用s.listenandserve()来处理请求。据我所知,这些请求是同时送达的。我使用一个简单的处理程序来检查它: 我看到,如果我发送了几个请求,我将看到所有的“1”出现,只有在一秒钟后所有的“2”出现。但是如果删除Hibernate行,我会看到程序在完成前一个请求之前从不启动请求(输出为1 2 1 2 1 2...)。所以我不明白,如果它们是并发的还是不是

  • 问题内容: 假设我有某种游戏。我有一个buyItem函数,如下所示: 如果我对该路由进行垃圾邮件处理,直到扣除用户余额(第二次查询),则用户余额仍为正。 我尝试过的 问题是将在第一〜5项要求。因此,这也不起作用。 我们如何处理这种情况?如果重要的话,我正在使用Sails.JS框架。 问题答案: 通过该方法,Sails 1.0现在具有完整的事务支持。例: 更新资料 正如一些评论者所指出的,启用连接池

  • 有一个场景,1000个请求要求redis获取名为goods_stock的密钥,同时在redis中设置该密钥的vaule等于goods_stocks-1,redis服务器如何处理这些请求?它是否处理默认队列,就像每个请求都是块请求一样?

  • 问题内容: 我知道Node.js使用单线程和事件循环来处理仅一次处理一个请求的请求(这是非阻塞的)。但是,这是如何工作的,可以说有10,000个并发请求。事件循环会处理所有请求吗?那会不会花费太长时间? 我还不了解(至今)如何比多线程Web服务器更快。我知道多线程Web服务器的资源(内存,CPU)会更昂贵,但是会不会更快?我可能是错的。请说明该单线程在许多请求中的运行速度如何,以及在处理诸如10,