多執行緒與併發 發布與逸出

2021-08-18 01:38:22 字數 1367 閱讀 4087

發布(publish)乙個物件是指,使物件能夠在當前作用域之外的**中使用。當某個不應該發布的物件被發布時,這種情況就被稱為逸出(escape)

public

static setknownsecrets;//公有變數

public

void

initialize()

上述**在initialize方法中例項化了乙個hashset物件,並將其引用儲存到knownsecrets中發布了該物件(knownsecrets被宣告為公有變數,當前作用域之外的**可以訪問該物件),並且,如果將乙個secret物件新增到該集合(knownsecrets是乙個集合物件),那麼同樣會發布這個物件,因為任何**都可以遍歷這個集合。

class unsafestates;

public string getstates();

}

上述方式發布states,使得任何呼叫者都可以修改這個陣列的內容,因為在get方法中返回了states的引用,陣列states已經逸出了它所在的作用域,這個私有變數被發布了。

public

class thisescape});

}}

上述**在發布eventlistener時,也隱含的發布了thisescape例項本身,因為eventlistener是乙個非靜態內部類,乙個非靜態內部類在編譯完成後會隱含的儲存乙個它外圍類的引用「thiseacape.this」,然而在上述**中,建構函式還沒有完成,也就是說,thisescape本身還沒有構造好,但是其發布的物件就已經持有了乙個thisescape的引用。

在構造過程中使this引用逸出的乙個常見的錯誤是,在建構函式中啟動乙個執行緒。當物件在其建構函式中建立乙個執行緒時,無論是顯式建立還是隱式建立,this引用都會被新建立的執行緒共享,在物件沒有完全構造之前,新的執行緒就可以看見它

如果想要避免不正確的構造過程,可以採用工廠方法來防止this引用在構造過程中逸出。

public

class

safelistener()};}

public

static safelistener newinstance(eventsource source)

}

如果乙個已經發布的物件,能夠通過非私有的變數引用和方法呼叫到達其他的物件,那麼這些物件也都會被發布。無論其他執行緒會對已發布的引用執行何種操作,其實都不重要,因為誤用該引用的風險始終存在。

併發程式設計 發布與逸出

發布 物件能在當前作用域之外的 中使用。發布方式 1 物件引用儲存到其他地方 2 public方法返回物件引用 3 引用傳遞到其他方法 某個不該發布的物件發布,這種情況成為逸出 封裝使得程式的正確性進行分析變得可能,這也是封裝最重要的意圖,構造物件的過程中不要讓this引用逸出,常見的是在建構函式中...

併發程式設計 08安全發布物件之發布與逸出

小結 發布物件 使乙個物件能夠被當前範圍之外的 所使用,日常開發中比較常見的比如通過類的非私有方法返回物件的引用,或者通過公有的靜態變數發布物件等都屬於發布物件 物件逸出 首先需要明確的是物件逸出是一種錯誤的發布方式。當乙個物件還沒有構造完成時,就使它被其他執行緒所見。package com.art...

併發程式設計實踐筆記 物件的共享之發布與逸出

發布 物件的發布是指 使物件能夠在當前作用域之外的 中使用。例如在乙個非私有的方法中將私有屬性的物件引用直接返回。逸出 是指當某個不該被發布的物件被發布出去。例如,如果在物件完成構造之前就將其發布出去,就會破壞執行緒安全性。警惕this引用逸出。當從物件的建構函式中發布物件的時候,只是發布了乙個未構...