執行緒安全 2 多執行緒逸出分析和正確處理

2022-05-13 15:52:30 字數 770 閱讀 6506

多執行緒溢位寫法:

public class thisescape

});點評:加粗的這一段隱式this事件執行緒已經暴露給thisescape建構函式,而建構函式在該類中首先被其他類呼叫,因此整個this都暴露了。只要其他執行緒在thisescape未構造之前(構造返回狀態)呼叫這個類,那麼this就會被新建執行緒共享並識別它(執行緒溢位)。

因此正確的寫法:

public class thisescape};}

public static thisescape newinstance(eventsource source)

點評:利用工廠模式來規避eventlistener執行緒溢位,新建的執行緒無法在建構函式之前共享和識別safe,從而保證執行緒安全。

案例分析:

public class connectionpool

private void init()

public synchronized void release(connection conn)

/*** 關閉連線池中所有資料庫的連線

*/public synchronized void closepool()else

}private void addconnection(){

connection conn=null;

for(int i=0;i點評:這個連線池算是比較健全了,但還是有不足的地方,看下標記的綠色的部分應加上final,橙色加粗部分應加上volatile

執行緒安全 2 多執行緒逸出分析和正確處理

多執行緒溢位寫法 public class thisescape 點評 加粗的這一段隱式this事件執行緒已經暴露給thisescape建構函式,而建構函式在該類中首先被其他類呼叫,因此整個this都暴露了。只要其他執行緒在thisescape未構造之前 構造返回狀態 呼叫這個類,那麼this就會被...

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

發布 publish 乙個物件是指,使物件能夠在當前作用域之外的 中使用。當某個不應該發布的物件被發布時,這種情況就被稱為逸出 escape public static setknownsecrets 公有變數 public void initialize 上述 在initialize方法中例項化了...

多執行緒與執行緒安全2

1 例子 用兩個執行緒,交替列印1 100的數字 public class main class number implements runnableelse try catch interruptedexception e 涉及到的三個方法 wait 一旦執行到此處,當前執行緒就進入阻塞狀態,並且...