簡體   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