天天看點

java-多線程 | 線程安全和線程同步(未完待續)

線程安全就是多線程通路時,采用了加鎖機制,當一個線程通路該類的某個資料時,進行保護,其他線程不能進行通路直到該線程讀取完,其他線程才可使用。不會出現資料不一緻或者資料污染。 線程不安全就是不提供資料通路保護,有可能出現多個線程先後更改資料造成所得到的資料是髒資料。

1.把共享的變量資料辨別為private

2.使用synchronized關鍵字同步方法或代碼。

java中使用Volidate變量所需的編碼較少,并且運作時開銷也較少,但是它所能實作的功能也僅是 synchronized 的一部分。Synchronized是對Volidate的基礎上增加了互斥的功能。 1.Volidate:隻保證可見性,可以多個線程同時通路voliadte修飾的變量。 2.Synchroinzed:既保證了可見性又保證了互斥性。同時隻能有一個線程去通路。 volatile 變量可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 與鎖相比,Volatile 變量是一種非常簡單但同時又非常脆弱的同步機制,它在某些情況下将提供優于鎖的性能和伸縮性。如果嚴格遵循 volatile 的使用條件 —— 即變量真正獨立于其他變量和自己以前的值 —— 在某些情況下可以使用 volatile 代替 synchronized 來簡化代碼。然而,使用 volatile 的代碼往往比使用鎖的代碼更加容易出錯。 當使用volatile 聲明的變量的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被儲存。

通過synchronized關鍵字對代碼塊進行同步(加鎖),保證共享的變量同一時間隻能有一個線程在操作。其他線程則等待該線程執行完畢後在進行操作,這樣就保證了線程的同步和共享資料的安全!

synchronized 同步代碼塊的鎖可以是任意類對象(繼承Thread類),這個對象必須是線程共享類(靜态的)

synchronized 可以加在方法上,如果是靜态方法synchronized的鎖就是這個類的類對象,如果不是靜态方法,synchronized 加在對象方法上,這個鎖就是this