簡體   English   中英

java類方法如何分配內存並在單線程和多線程環境中執行?

[英]How does java class method is allocated memory and executed in single threaded and multithreaded environment?

我了解了如何執行方法,這是我的理解:1)方法在方法區域中分配了內存,並且僅維護一個副本,該副本在類的所有實例中使用。 2)當從實例調用方法時,當前線程(單線程環境)說main被加載,然后通過instance.eg調用的方法加載堆棧:

main(String ags[])
{
   A a = new A();
   a.method();
}
// code of method
 method()
 {
   for(int i=0;i<25;i++)
   system.out.println(i);
 }

因此,對於該線程,它具有自己的調用堆棧,然后在方法調用時,具有本地變量的相同方法主體被推入main方法上方的同一堆棧中。

現在基於上述理解,我不了解的是,在多線程環境中,如果我運行兩個線程並且都共享相同的實例,那么相同的代碼將如何表現。 例如:

//My run method for myRunnable
run()
{
  a.method();
}

Thread one = new Thread(new myRunnable(a)); // object from above
Thread two= new Thread(new myRunnable(a));

現在,當兩個線程開始執行時,它們將具有自己的調用堆棧。

在這種情況下,共享對象的方法將如何執行?

謝謝

1)方法在方法區域中分配了內存,並且僅維護一個副本,該副本在類>>的所有實例中使用,這意味着方法實現的字節碼在所有實例中僅一個。 並且方法字節碼存儲區與對象的堆分開。

每個線程都有自己的堆棧,就像您對其進行解釋一樣。

如果您有多個線程在同一個對象上同時運行相同的方法,則將出現以下情況:

  • 局部變量存儲在每個線程的堆棧中。 它們不會共享,不會沖突。

  • 對象實例( this )及其所有字段(例如this.foo )都存儲在堆中。 堆是共享的。 為確保其正常工作,您必須適當地應用線程同步機制。

  • static字段也被共享,訪問也必須被協調

在您的示例中,循環中的i是局部變量。 兩個線程將按順序打印所有數字(但是兩個線程的輸出以未定義的順序交錯)。

好,你走進一個房間。

有人遞給您一個剪貼板,鉛筆和白板筆,然后告訴您開始按照牆上的特定海報上寫的說明進行操作。

另一面牆上有一個白板:它看起來像一個電子表格,其中包含行和列,以及在單元格中寫入的數字和單詞。 剪貼板上有一張紙,上面有更多的行和列,有些數字寫在鉛筆的某些單元格中。

這些說明逐步告訴您如何執行一些復雜的計算。 他們說,

...
Step 37: Copy the number from B5 on the whiteboard into J2 on your
         clipboard.
Step 38: Add J2 through J7 on your clipboard, and write the result in J9.
Step 39: If the result in J9 is greater than the value in whiteboard-C9,
         then go back to step 22, otherwise, go on to step 40.
Step 40: Erase whiteboard-C9, and then copy the value from clipboard-J9
         into that location.
...

剪貼板上有一個空間,您可以在其中寫下自己的筆記。 例如,您可以使用它來跟蹤執行的步驟,或者完成工作需要記住的其他內容。

牆上還有其他海報,還有其他人,每個人都有他/她自己的剪貼板。 有些人遵循與您相同的海報的指示,而有些人則從其他海報中閱讀。 每個人都在同一白板上閱讀/書寫。

每個人都按照自己的步調前進。 那些與您閱讀同一張海報的人並不一定要與您走同一步,而且由於你們每個人的剪貼板上都有不同的初始編號,因此您甚至可能沒有按照相同的順序執行說明。

這是一個多線程計算的簡化模型:牆上的海報是方法,白板是堆,人員是線程,剪貼板是堆棧。

這也與工業時代的科學/工程計算方法大致相似。 從事這種工作的人稱為“計算機”。

如果您要協調整個過程,並且是時候添加新的“線程”(即,當新的志願者走進房間時),那么您需要給該人自己的剪貼板(堆棧),具有自己的初始值(參數),但是您不給新人自己的海報(方法):您只是將他/他指向牆上已經出現的一張海報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM