java 多線程調用單例類的同一個方法


1,java多線程調用 單例類中一個的方法是不會排隊的,因為jvm 在每個線程下,都有一份 對調用方法的引用。
2,多個線程調用的同一個對象的同一個方法:
如果方法里無成員變量,不受任何影響;
如果方法里有成員變量,只有讀操作,不受影響,存在賦值操作,有影響
3,多線程調用同一個方法,局部變量會共享嗎?
局部變量不會受多線程影響;
成員變量會受到多線程影響

jvm每個線程都擁有一個方法調用棧,用於跟蹤線程中運行的一系列方法調用過程, 棧中的每個元素成為棧幀,線程調用每個方法時會將方法棧壓入一個新幀, 幀里面存放方法參數,局部變量,運算過程產生的臨時數據.

 

Java中的棧
每當啟用一個線程時,JVM就為他分配一個Java棧,棧是以幀為單位保存當前線程的運行狀態。某個線程正在執行的方法稱為當前方法,當前方法使用的棧幀稱為當前幀,當前方法所屬的類稱為當前類,當前類的常量池稱為當前常量池。當線程執行一個方法時,它會跟蹤當前常量池。

每當線程調用一個Java方法時,JVM就會在該線程對應的棧中壓入一個幀,這個幀自然就成了當前幀。當執行這個方法時,它使用這個幀來存儲參數、局部變量、中間運算結果等等。

Java棧上的所有數據都是私有的。任何線程都不能訪問另一個線程的棧數據。所以我們不用考慮多線程情況下棧數據訪問同步的情況。

像方法區和堆一樣,Java棧和幀在內存中也不必是連續的,幀可以分布在連續的棧里,也可以分布在堆里

Java棧的組成元素——棧幀
棧幀由三部分組成:局部變量區、操作數棧、幀數據區。局部變量區和操作數棧的大小要視對應的方法而定,他們是按字長計算的。但調用一個方法時,它從類型信息中得到此方法局部變量區和操作數棧大小,並據此分配棧內存,然后壓入Java棧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM