Java併發核心知識講解

併發編程是Java程序員最重要的技能之一,也是最難掌握的一種技能。它要求編程者對計算機最底層的運作原理有深刻的理解,同時要求編程者邏輯清晰、思維縝密,這樣才能寫出高效、安全、可靠的多線程併發程序。

一、共享性
數據共享性是線程安全的主要原因之一。如果所有的數據只是在線程內有效,那就不存在線程安全性問題,這也是我們在編程的時候經常不需要考慮線程安全的主要原因之一。但是,在多線程編程中,數據共享是不可避免的。最典型的場景是數據庫中的數據,爲了保證數據的一致性,我們通常需要共享同一個數據庫中數據,即使是在主從的情況下,訪問的也同一份數據,主從只是爲了訪問的效率和數據安全,而對同一份數據做的副本

二、原子性
原子性就是指對數據的操作是一個獨立的、不可分割的整體。換句話說,就是一次操作,是一個連續不可中斷的過程,數據不會執行的一半的時候被其他線程所修改。保證原子性的最簡單方式是操作系統指令,就是說如果一次操作對應一條操作系統指令,這樣肯定可以能保證原子性。但是很多操作不能通過一條指令就完成。

三、互斥性
資源互斥是指同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。我們通常允許多個線程同時對數據進行讀操作,但同一時間內只允許一個線程對數據進行寫操作。所以我們通常將鎖分爲共享鎖和排它鎖,也叫做讀鎖和寫鎖。如果資源不具有互斥性,即使是共享資源,我們也不需要擔心線程安全。

四、有序性
 爲了提高性能,編譯器和處理器可能會對指令做重排序。重排序可以分爲三種:

  (1)編譯器優化的重排序。編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執行順序。

  (2)指令級並行的重排序。現代處理器採用了指令級並行技術(Instruction-Level Parallelism, ILP)來將多條指令重疊執行。如果不存在數據依賴性,處理器可以改變語句對應機器指令的執行順序。
  (3)內存系統的重排序。由於處理器使用緩存和讀/寫緩衝區,這使得加載和存儲操作看上去可能是在亂序執行

五、可見性
要理解可見性,需要先對JVM的內存模型有一定的瞭解,JVM的內存模型與操作系統類似

本文對Java 併發編程中的理論基礎進行了講解,有些東西在後續的分析中還會做更詳細的討論,如可見性、順序性等。後續的文章都會以本章內容作爲理論基礎來討論。如果大家能夠很好的理解上述內容,相信無論是去理解其他併發編程的文章還是在平時的併發編程的工作中,都能夠對大家有很好的幫助。

參考資料下載:https://pan.baidu.com/s/1IoPtSgqUVh0LXgWUCNl4Jg 提取碼: imj2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章