java執行緒學習 2 物件的共享

2021-06-17 00:31:48 字數 1173 閱讀 3536

編寫安全的執行緒就是對共享資料的操作不出現問題,通過同步使來避免多個執行緒同一時刻方位共享資料,或者共享和發布物件,從而使能夠安全地由多個執行緒同時訪問。

可見性:

public class novisibility 	}	

public static void main(string args)

}

這段**不推薦這麼做,因為**中沒有使用足夠的同步機制,無法保證主線程寫入的值對於讀執行緒來說是可見的。

實際上說就是主線程跟讀執行緒共享變數number跟ready,主線程寫入變數的值得時候,讀執行緒很有可能看不到主線程寫的值,程式的執行順序可能不是我們想象中的那樣,即程式可能會持續迴圈下去。(不過在我本機測試多少次,都是輸出42,不知為何正常執行)

失效資料:

由於不同步的存在,訪問的共享變數可能是更新後的最新值,也可能是以前的失效值。

當執行緒在沒有同步的情況下讀取變數,可能會得到乙個失效值,至少這個值有之前的變數設定的值,而不是乙個隨機值,這種安全性被稱為最低安全性。不過存在乙個例外條件,就是非volatile型別的long或double變數,如果讀寫操作在不同的執行緒中執行,很有可能得到某個高32位或者低32位的隨機值。

volatile變數:

volatile boolean asleep;

while(!asleep)

countsomesleep();

這段**還是蠻有意思的  說某天失眠了,通過數羊來解決睡眠問題,然而入睡又是個多方面原因,這個可以看成多個執行緒在影響你是否入睡,asleep這個引數被多個執行緒控制,為了確保你現在是否真的睡著,asleep這個變數總是的到的最新值。

volatile提供一種比加鎖機制稍弱的同步機制,確保這個變數一直被共享。加鎖機制既可以確保可見性以及原子性,然而volatile智慧型確保可見性。volatile使用必須滿足的條件:

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

該變數不會與其他狀態變數一起納入不變性條件中。

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

執行緒發布與逸出:

這部分內容現在感覺還晦澀難懂,以後再來說。

1.ad-hoc執行緒封閉

由於封閉技術的脆弱性,因此盡量少用它。

2.棧封閉

下邊的內容讀起來有困難,先跳過這一章。

併發程式設計學習 2 物件的共享

思維導圖 本文主要介紹類的域變數被多個執行緒共享時所導致的可見性問題。我所理解的可見性是指類的域變數在某一線程中變化時能夠及時準確的被其他執行緒所看見。文章還是分成兩個部分進行描述 理論部分 包括如何判斷域變數是否可見,會導致什麼樣的問題,又該如何解決。使用部分 通過 不發布物件 發布但不可修改 安...

3物件的共享

作用 將當前執行緒對volatile的改變立即通知給其他執行緒 保證了volatile變數對執行緒的可見性 volatile是一種比synchronizyed稍弱的同步機制 對可見性的影響 volatile變數對可見性的影響比volatile變數本身更為重要。當執行緒a首先寫入乙個volatile變...

python學習筆記2(物件)

物件的屬性不能繼承。方法可以呼叫沒有的引數或方法,但執行時會報錯。property setter標記的方法可以當作屬性來用。class animal object def init self self.age yi def run self print self.name,is running cl...