使得乙個物件在當前範圍之外可見。比如通過公開方法返回乙個物件的引用、通過類靜態變數公布物件.
與之對應的是逸出,指不正確的發布物件,比如將乙個私有的物件發布出去,或者還沒有正確構造完成物件,此物件就已經對外部可見
共有四種方式安全地發布物件
在單例模式中,如何保證只例項化乙個物件並保證執行緒安全?
下面是乙個典型的錯誤
@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...