This引用逃逸

2021-09-01 20:35:27 字數 637 閱讀 2092

this逃逸:this逃逸就是說,在建構函式返回之前,其他執行緒就已經取得了該物件的引用,由於建構函式還沒有完成,所以,物件也可能是殘缺的,所以,取得物件引用的執行緒使用殘缺的物件極有可能發生錯誤的情況。因為這兩個執行緒是非同步的,取得物件引用的執行緒並不一定會等待構造物件的執行緒完結後在使用引用。

併發程式設計實踐中,this引用逃逸("this"escape)是指物件還沒有構造完成,它的this引用就被發布出去了。這是危及到執行緒安全的,因為其他執行緒有可能通過這個逸出的引用訪問到「初始化了一半」的物件(partially-constructed object)。這樣就會出現某些執行緒中看到該物件的狀態是沒初始化完的狀態,而在另外一些執行緒看到的卻是已經初始化完的狀態,這種不一致性是不確定的,程式也會因此而產生一些無法預知的併發錯誤

這個鏈結中this逃逸的兩個條件如下

它需要滿足兩個條件:乙個是在建構函式中建立內部類(eventlistener),另乙個是在建構函式中就把這個內部類給發布了出去(source.registerlistener)

發布出去的內部類物件自帶對外部類this的訪問許可權。

所以在使用內部類的時候,在外部類寫構造方法並且在構造方法中new innerclass()的時候,需要避免發布這個內部類物件,否則會破壞外部類物件的構造方法的一致性問題.

this指標逃逸問題

簡述 this逃逸是指在建構函式返回之前其他縣城就持有該物件的引用。呼叫尚未構造完成的物件的方法可能引起奇怪的問題。this逃逸經常發生在建構函式中啟動執行緒或者註冊 時,例如 public class thisescape private class escaperunnable implemen...

逃逸分析 Escape Analysis)

什麼是逃逸?逃逸是指在某個方法之內置立的物件,除了在方法體之內被引用之外,還在方法體之外被其它變數引用到 這樣帶來的後果是在該方法執行完畢之後,該方法中建立的物件將無法被gc 由於其被其它變數引用。正常的方法呼叫中,方法體中建立的物件將在執行完畢之後,將 其中建立的物件 故由於無法 即成為逃逸。無逃...

golang逃逸分析

帶gc語言給我們程式的編寫帶來了極大的便利,但是與此同時遮蔽了很多底層的細節,比如乙個物件是在棧上分配還是在堆上分配。對於普通的 來說雖然不需要關心這麼多,但是作為強迫症程式猿,還是希望能讓自己寫出來的 效能最優,所以還是需要了解什麼是逃逸,以及如何判斷是否發生了逃逸。首先需要知道,我們說的堆和棧是...