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

開發過程中,遇到此類場景,基礎不牢地動山搖,果斷網上找文章學習,摘錄文章,記錄一下:

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


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

Java中的棧

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

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

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

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

Java棧的組成元素——棧幀

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章