【參考鏈結】
我們在啟動執行緒的時候,也經常使用匿名內部類的方式,那麼此時記憶體的狀態是怎樣的呢?
以如下**為例
已經加了斷點,在eclipse中啟動除錯,兩個執行緒都停在了加斷點的地方
在main執行緒中,有main()方法的棧幀,其中有兩個區域性變數,string[0]型別的args和test型別的t。 (因為main()方法是靜態的,所以沒有區域性變數this)
在thread-0執行緒中,有匿名內部類.run()方法的棧幀。其中有兩個區域性變數,匿名內部類test$1型別的this和float型別的f(因為是非靜態的所以有this)
並且this物件的結構如下
在建立這個匿名內部類的物件的時候,將外部物件賦值給this$0,將所在的外部類方法中的區域性變數賦值給val$arg1、val$v1。
然後以這個run()方法作為新執行緒的啟動方法
總結來說就是
雖然run()方法沒有引數,但是其作為非static方法有預設有乙個區域性變數指向其匿名內部類物件,而這個匿名內部類物件中又有成員指向外部類物件,有成員賦值自所在方法的區域性變數。
經常會直接在run()方法中訪問外部類的物件型別成員變數,此時原執行緒、子執行緒就都是在訪問同乙個物件,可能導致併發問題。
型別記憶體模型(物件記憶體模型)
型別的記憶體模型的3個問題 1 包含什麼 附加資訊 2 怎麼布局 記憶體對齊 3 使用場景 怎麼使用附加資訊 除了包含結構型別的顯式成員變數外,型別記憶體模型需要解決附加資訊的引入問題 1 附加資訊 opaque 有哪些 型別資訊 函式資訊 繼承資訊 記憶體計數等 2 為什麼有附加資訊 1 解決多型...
物件記憶體模型
物件物件模型 物件在記憶體是如何存放的 存放規則 1.class記憶體對齊規則和struct相同。2.class 成員函式和成員變數分開存放,每個物件有獨享的成員變數 堆疊全域性資料 同一類的所有物件共享同一成員函式 段 3.呼叫成員函式時將物件位址傳遞給成員函式 隱式傳遞 成員函式通過物件位址 t...
python物件記憶體模型
首先介紹一下python物件的記憶體模型,如下圖1所示 圖1.pyobject物件記憶體模型 上圖可以看到,乙個pyobject必須包含ob refcnt和ob type 這兩個屬性 ob refcnt是這個物件的引用計數,而ob type則是指向 typeobject結構體的指標,它是python...