[英]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.