sar*_*mar 52 java concurrency spring multithreading multiprocessing
我有一个关于单例bean如何详细地处理并发请求的问题.
我在StackOverflow上搜索过这个问题.这是stackoverflow的示例链接,但我发现只有高级细节.我想要了解单例bean如何服务并发请求以及系统处理器如何看到这些请求的完整细节.
我已经研究了在线系统处理器中的并发请求处理.他们说处理器本身有一个调度程序,调度程序将决定处理哪个请求.
好的.如果假设我有多个核心处理器,那么调度程序如何处理并发请求?
任何人都可以向我解释一个单步bean如何在JVM和系统中提供并发请求的分步过程吗?
让我用一个具体的例子来解释.我有一个类Sports:
class Sports {
public void playFootball() {
}
public void playVolleyBall() {
}
}
Run Code Online (Sandbox Code Playgroud)
有两个请求进入.第一个请求是playFootball在创建的单例类实例上执行方法Sports.同时,另一个请求是playVolleyBall在同一个创建的单例类实例上执行该方法Sports.
如何使用单例实例?
Dev*_*sai 93
Saravan Kumar,
我理解你的问题背后的动机.在我开始编写编译器之前,我也有一个非常相似的想要了解Java虚拟机的内部结构.
首先,我对你的问题印象深刻.为了解决你的问题,需要有几点区分和理解.首先:Singleton模式,有时甚至称为反模式,确保JVM(Java虚拟机)只有一个此类实例可用.这意味着我们基本上将全局状态引入应用程序.我知道你明白这一点,但这只是一个澄清点.
现在是内部.
当我们创建一个类的实例时,我们正在创建一个驻留在JVM共享内存中的对象.现在,这些线程独立执行在这些实例上运行的代码.每个线程都有一个工作内存,在该内存中保存所有线程之间共享的主内存数据.这是您创建的Singleton对象的引用所在的位置.基本上发生的事情是生成的字节码和代表您创建的单例对象的字节码正在这些线程中的每一个上执行.
现在,如何发生这种情况的内部结构如下:
每个JVM线程都有一个私有JVM堆栈,与线程同时创建.现在,JVM有一个在所有JVM线程之间共享的堆.堆是运行时数据区,从中分配所有类实例和数组的内存.堆在VM启动时创建.当您的线程请求单例实例时,它将指向堆中此Singleton的字节码所在的引用.它将执行适当的代码.在您的情况下,它将执行第一个请求的第一个方法和第二个请求的第二个方法.它能够执行此操作,因为没有锁或限制阻止编译器将程序计数器指向分配此实例的堆中的区域.Singleton类对Java虚拟机的唯一限制是它在该类的堆中只能有一个实例.就是这样.除此之外,你可以从你的方法中引用它100倍,编译器将指向相同的字节码并简单地执行它.这就是为什么我们通常希望Singleton类是无状态的,因为如果我们任何线程访问它,我们不希望内部变量因为缺乏并发控制而变异.
请让我知道,如果你有任何问题!
Var*_*nis 20
理想的单例bean不应该保持任何状态.这意味着它不会有任何变量存储特定于它所服务的请求的任何内容.
因此,单例bean将简单地具有无状态代码(例如,控制器方法),其可以针对多个请求并发地执行而没有任何并发问题.
例如,如果以下是您的单例bean:
@Service
public class Calculator {
public int sum(int a, int b) {
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
简单来说,当两个"请求"同时调用sumbean的sum方法时,这意味着该方法将在两个不同的线程中同时执行.因此,他们将拥有自己的执行上下文,这些上下文不会相互重叠.这将安全地允许它们同时运行.
如果同一个bean的状态如下:
@Service
public class Calculator {
int incrementalMultiplier = 0;
public int mulitply(int a, int b) {
incrementalMultiplier++;
return a * b * incrementalMultiplier;
}
}
Run Code Online (Sandbox Code Playgroud)
这可能会在同时提供两个请求时导致问题,因为incrementalMultiplier对象级别状态将由两个请求(线程)共享,因此可能产生意外结果.
简而言之,无状态单例将能够同时处理两个请求,因为它们将位于不同的线程中.
CHo*_*paM -1
Singleton 是一个 bean 范围。您必须处理如何为多线程访问提供服务。您可以使用同步或并发包。参考:Spring 单例 bean 线程安全吗?
对于并发请求,单个bean将一一服务于多个请求。
| 归档时间: |
|
| 查看次数: |
32000 次 |
| 最近记录: |