併發程式設計(二)

2021-10-03 18:43:05 字數 1221 閱讀 4723

使得乙個物件在當前範圍之外可見。比如通過公開方法返回乙個物件的引用、通過類靜態變數公布物件.

與之對應的是逸出,指不正確的發布物件,比如將乙個私有的物件發布出去,或者還沒有正確構造完成物件,此物件就已經對外部可見

共有四種方式安全地發布物件

單例模式中,如何保證只例項化乙個物件並保證執行緒安全?

下面是乙個典型的錯誤

@notthreadsafe

public class singlenton

private static singlenton instance = null;

public static singlenton getinstance()}}

return instance;

}}

以上雙重檢測的單例模式是執行緒不安全的,原因在於指令重排序,初始化instance操作一共有三步:1分配記憶體;2在該記憶體空間上初始化物件;3將instacne變數指向分配的記憶體位址。由於2、3之間無依賴,因此重排序可能會按照1 3 2的順序執行,如果有兩個執行緒,乙個執行緒執行了1之後執行3,將instacne指向分配的記憶體位址,另外乙個執行緒執行到外層檢測,此時發現instance不是null,然後返回該物件,但是此時該物件還沒有初始化,即沒有執行操作2,因此獲取到該物件並進行使用會發生錯誤。解決的方法就是防止對instance初始化的指令重排序,通過volatile修飾instance

@threadsafe

public class singlenton

private static volatile singlenton instance = null;

public static singlenton getinstance()}}

return instance;

}}

還有一種方法可以保證安全的單例模式:列舉單例

public class singlenton

public static singlenton getinstance()

private enum singlentonenum

public singlenton getinstance()

}}

JAVA併發程式設計(二)

一.可見性 讀操作能實時的看到寫操作最新寫入的值。在單執行緒中,讀操作總能得到寫操作寫入的值 但在多執行緒中,如果讀操作跟寫操作在不同的執行緒中執行,那麼讀操作將不一定能適時的看到其他執行緒寫入的值。二.重排序 在沒有使用同步的情況下,編譯器 處理器 執行時都有可能做操作的執行順序進行一些調整。三....

Java併發程式設計(二)之併發程式設計挑戰篇

在進行併發程式設計開發時,會面臨一些挑戰,主要包括三個方面 上下文切換 死鎖 資源限制 挑戰一 上下文切換的挑戰 上下文切換 單個cpu同乙個時刻只能執行一條執行緒,作業系統會給每條執行緒分配時間片來對執行緒進行排程操作,執行緒在得到的時間片內占用cpu資源處理自身資料,當作業系統從乙個執行緒切換到...

iOS併發程式設計(二) NSOperation

cocoa提供了三種不同的nsoperation 1.nsblockoperation block operations提供了利用block 物件來執行task的方法。2.nsinvocationoperation 顧名思義,invocation operation提供了呼叫普通method來執行t...