Java併發基礎

 

(1)Java中的主要同步機制是關鍵字synchronized,它提供了一種獨佔的加鎖方式,但「同步」這個術語還包括volatile類型的變量,顯式鎖以及原子變量。安全

(2)線程安全性:當多個線程訪問某個類時,這個類始終都能表現出正確的行爲,那麼就稱這個類是線程安全的。線程

(3)要避免競態條件問題,就必須在某個線程修改該變量時,經過某種方式防止其餘線程使用這個變量,從而確保其餘線程只能在修改操做完成以前或以後讀取和修改狀態,而不是在修改狀態的過程當中。對象

(4)若是當多個線程訪問同一個可變的狀態變量時沒有使用合適的同步,那麼程序就會出現錯誤。有三種方式能夠修復這個問題:blog

· 不在線程之間共享該狀態變量。同步

· 將狀態變量修改成不可變的變量。變量

· 在訪問狀態變量時使用同步。引用

(5)Java提供了一種內置的鎖機制來支持原子性:同步代碼塊。請求

同步代碼塊包括兩部分:一個做爲這個鎖的對象引用,一個做爲由這個鎖保護的代碼塊。以關鍵字synchronized來修飾的方法就是一種橫跨整個方法體的同步代碼塊,其中該同步代碼塊的鎖就是方法調用所在的對象。程序

synchronized(lock){方法

//訪問或修改由鎖保護的共享狀態

}

每一個Java對象均可以用做一個實現同步的鎖,這些鎖被稱爲內置鎖或監視器鎖。線程在進入同步代碼塊以前會自動得到鎖,而且在退出同步代碼塊時會自動釋放鎖,而不管是經過正常的控制路徑退出,仍是經過從代碼塊中拋出異常退出。得到內置鎖的惟一途徑就是進入由這個鎖保護的同步代碼塊或方法。

(5)Java的內置鎖至關於一種互斥體,意味着最多隻有一個線程能持有這種鎖。

(6)因爲每次只能有一個線程執行內置鎖保護的代碼塊,所以由這個鎖保護的同步代碼塊會以原子方式執行,多個線程在執行該代碼塊時也不會相互干擾。

(7)當某個線程請求一個由其餘線程持有的鎖時,發出請求的線程就會阻塞。然而因爲內置鎖是可重入的,所以若是某個線程試圖得到一個已經由他本身持有的鎖,那這個請求就會成功。

(8)

相關文章
相關標籤/搜索