繁体   English   中英

同时调用时JVM方法调用内部

[英]JVM method invocation internals when simultaneous invocation

标题很难制定,因此,如果有人可以使其更简洁,我将非常感激。

我知道Java中方法调用的工作方式。 基本上,JVM拥有一个查找表,可在其中查找特定方法,然后调用该方法。

例如,假设我们有一个MyClass类型的实例列表,我们通过在每个实例上调用iE toString()来处理并行流。 会有多个线程同时调用toString()。 全部都指向方法堆栈中的相同toString()。

所以我的问题是:JVM内部是否进行了一些内部同步处理? 还是每个对象都有自己的内联方法?

我找不到关于此的任何详细信息。 为此,Oracle Docs太高级了。 指针将不胜感激。

谢谢

数据是同步的,而不是代码(方法)。

每个线程都有其自己的堆栈 ,在该堆栈中存储了本地变量和被调用方法链的返回地址。 当程序遇到方法调用时,返回点的地址(方法调用完成时要执行的指令)存储在线程堆栈中,程序流跳转到新方法(执行该方法的指令)。

可以有许多执行相同代码的线程(位于内存中某处的同一组指令),但是每个线程都有自己的堆栈。

我知道Java中方法调用的工作方式。 基本上,JVM拥有一个查找表,可在其中查找特定方法,然后调用该方法。

正确。

例如,假设我们有一个MyClass类型的实例列表,我们通过在每个实例上调用iE toString()来处理并行流。 会有多个线程同时调用toString()。 全部都指向方法堆栈中的相同toString()。

正确。

所以我的问题是:JVM内部是否进行了一些内部同步处理?

没有为什么? 该代码是只读的:它不需要顺序访问。

还是每个对象都有自己的内联方法?

否。为什么需要它?

越来越技术,但是..

基本上,JVM拥有一个查找表,可在其中查找特定方法,然后调用该方法。

它可以,但是可以绕过方法的多个实现,而无需使用这种查找表。

会有多个线程同时调用toString()。 全部都指向方法堆栈中的相同toString()。

虽然代码在概念上是只读的,但实际上它是分阶段编译和重新编译的,也可能是反编译的。 每次发生这种情况时,代码实际上都已更改。 它做同样的事情,但是方式不同。 这样做是在代码运行时交换对代码的引用,这可能意味着不同的线程可能在短时间内运行同一方法的不同版本。

所以我的问题是:JVM内部是否进行了一些内部同步处理?

它不使用JVM可见锁,我怀疑它根本不使用互斥锁,而是使用线程安全操作来交换应调用的方法。

还是每个对象都有自己的内联方法?

对象有数据,没有方法。 对象具有对类的引用,该类具有对方法的引用。 这些引用可以在应用程序的整个生命周期内进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM