物件的共享

2021-08-21 22:13:07 字數 1626 閱讀 8055

一、記憶體可見性

在沒有同步的情況下,編譯器、處理器以及執行時等都可能對操作的執行順序進行一些意想不到的調整。在缺乏足夠同步的多執行緒程式中,要想對記憶體操作的執行順序進行判斷,幾乎無法得出正確的結論。

使用volatile修飾的變數,最低安全性適合於絕大多數的變數,非volatile型別的64位數值變數(long,double)。

加鎖的行為不僅是實現互斥還包括記憶體可見性。為了確保所有的執行緒都能夠看到共享變數的最新值,所有執行讀操作和寫操作的執行緒都必須在同乙個鎖上同步。

volatile變數:(訪問不加鎖)

作用:用來確保變數的更新操作通知到其他執行緒。

當變數宣告為volatile型別後,編譯器與執行時都會注意到這個變數時共享的,因此不會將該變數上的操作與其他記憶體操作一起重排序。volitale變數不會被快取在暫存器或者對其他處理器不可見的地方,因此讀取volitale型別的變數時總會返回最新寫入的值。

volatile變數的通常用法:做為某個操作完成、發生中斷或者狀態的標誌。

滿足一下條件才可以使用volitale:

1、對變數的寫操作不依賴於變數的當前值,或者你能確保只有單個執行緒更新變數的值

2、該變數不會與其他狀態變數一起納入不可變條件中

3、在訪問變數時不需要加鎖。

二、發布和逸出

三、執行緒封閉

一種避免同步的方式就是不共享資料。如果僅在單執行緒內訪問資料,就不需要同步。區域性變數和threadlocal類,棧封閉其實就是區域性變數,乙個方法在執行的時候開啟乙個棧,將變數封裝在棧中。threadlocal物件常用於防止對可變的單例項變數或者全域性變數進行共享。

四、不變性

不可變物件一定是執行緒安全的

不可變物件的滿足條件:

1、物件建立以後其狀態不能修改

2、物件的所有域都是final型別

3、物件是正確建立的(在建立期間,this引用沒有逸出)

正如「除非需要更高的可見性,否則應將所有域都宣告為私有域」,同樣,「除非需要某個域是可變的,否者應將其宣告為final域」

使用volitale型別來發布不可變物件實現執行緒的安全

五、安全發布

常用的安全發布物件的模式:安全地發布乙個物件,物件的引用以及物件的狀態必須同時對其他執行緒可見。

1、在靜態初始化函式中初始化乙個物件的引用;(例如單例模式的懶漢模式)

2、將物件的引用儲存到volatile型別或者atomicreference物件中

3、將物件的引用儲存到某個正確構造物件的final型別域中;

4、將物件的引用儲存到乙個由鎖保護的域中;(例如安全容器)

物件的發布需求取決於它的可變性

1、不可變物件可以通過任意機制來發布;

2、事實不可變物件必須通過安全方式來發布;

3、可變物件必須通過安全方式來發布,並且必須是執行緒安全的或者由某個鎖來保護起來;

併發執行緒使用共享物件的一些實用策略:

1、執行緒封閉

2、唯讀共享(不可變物件和事實不可變物件)

3、執行緒安全共享(???)

4、保護物件(鎖機制)

物件的共享

記憶體可見性 多執行緒訪問共享資料,乙個執行緒的修改,其他執行緒是否能做得到通知。每個執行緒都有自己的工作記憶體,其中包含了共享資料的拷貝,寫執行緒僅僅是更新了自己工作記憶體的資料拷貝,如果該拷貝沒有更新到主存,那麼其他執行緒不會知道該更新,就是說該更新對其他執行緒是不可見的。public clas...

核心物件共享

1 通過 控制代碼繼承 實現核心物件的共享 父程序 include stdafx.h include define max buffer size 2048 int main int argc,char argv lpfilebuffer heapalloc getprocessheap 堆控制代碼...

flex共享物件

1 什麼是共享物件 sharedobject 共享物件 可以看作是小型的資料庫,它用來儲存任何flash支援的資料型別,比如數字 字串 陣列和物件等等。sharedobject按存放位置可分為本地型 存在客戶端 和遠端型 存在伺服器端 本地型共享物件的擴充套件名為.sol。本地型共享物件只能將資料儲...