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