1,java多線程調用 單例類中一個的方法是不會排隊的,因為jvm 在每個線程下,都有一份 對調用方法的引用。
2,多個線程調用的同一個對象的同一個方法:
如果方法里無成員變量,不受任何影響;
如果方法里有成員變量,只有讀操作,不受影響,存在賦值操作,有影響
3,多線程調用同一個方法,局部變量會共享嗎?
局部變量不會受多線程影響;
成員變量會受到多線程影響
jvm每個線程都擁有一個方法調用棧,用於跟蹤線程中運行的一系列方法調用過程, 棧中的每個元素成為棧幀,線程調用每個方法時會將方法棧壓入一個新幀, 幀里面存放方法參數,局部變量,運算過程產生的臨時數據.
Java中的棧
每當啟用一個線程時,JVM就為他分配一個Java棧,棧是以幀為單位保存當前線程的運行狀態。某個線程正在執行的方法稱為當前方法,當前方法使用的棧幀稱為當前幀,當前方法所屬的類稱為當前類,當前類的常量池稱為當前常量池。當線程執行一個方法時,它會跟蹤當前常量池。
每當線程調用一個Java方法時,JVM就會在該線程對應的棧中壓入一個幀,這個幀自然就成了當前幀。當執行這個方法時,它使用這個幀來存儲參數、局部變量、中間運算結果等等。
Java棧上的所有數據都是私有的。任何線程都不能訪問另一個線程的棧數據。所以我們不用考慮多線程情況下棧數據訪問同步的情況。
像方法區和堆一樣,Java棧和幀在內存中也不必是連續的,幀可以分布在連續的棧里,也可以分布在堆里
Java棧的組成元素——棧幀
棧幀由三部分組成:局部變量區、操作數棧、幀數據區。局部變量區和操作數棧的大小要視對應的方法而定,他們是按字長計算的。但調用一個方法時,它從類型信息中得到此方法局部變量區和操作數棧大小,並據此分配棧內存,然后壓入Java棧。