Java基礎之高併發編程

1.Java併發基礎

JVM中存在一個主存區(Main Memory或Java Heap Memory),對於所有線程進行共享,而每個線程又有自己的工作內存(Working Memory),工作內存中保存的是主存中某些變量的拷貝,線程對所有變量的操作並非發生在主存區,而是發生在工作內存中,而線程之間是不能直接相互訪問,變量在程序中的傳遞,是依賴主存來完成的。

2.多線程的重要概念

可見性:假設有一個變量i,那麼i是保存在主存區中的,當某一個線程要操作i時,首先需要從主存將i加載工作內存中,這時就拷貝一份i到工作內存,在對i進行修改,修改完成再將i寫回主存中,新的i值才能被其他線城所讀取。可見性保證了數據的一致性。

可見性遵循以下原則:

  • 當一個線程運行結束後,所有的變量都會被flush會主存中;
  • 當一個線程第一次讀取某個變量的時候,會從主存中讀取最新的;
  • volatile修飾的變量會被立刻寫回主存中;
  • 當一個線程釋放鎖後,所有的變量的變化都會flush到主存中,然後一個使用了相同的同步鎖的進程將重新加載所有使用到的變量

原子性:就是當某一個相稱修改i的值時候,從去除i到將新的i值寫回主存之間,不能有其他線程對i進行操作。通過鎖機制或者CAS(Compare And Swap)操作可以保證操作的原子性。

有序性:假設在主存中存在兩個變量i,j,初始值都爲0,在某個線程A的代碼中一次對i和j進行自增操作,i,j修改的操作順序可能會被重新排序。那麼i,j寫回到主存的舒徐就可能不是按照i,j的順序了,這就是所謂的reordering。可以通過volatile修飾共享變量,使JVM在重排序時不對該變量排序,保證其有序性。

3.線程安全

HashMap是線程不安全的,如果要考慮安全性問題,可以使用HashTable或者Collections.synchronizedMap(hashMap),着臉腫是對整個hash表進行鎖定操作,性能不高。

4.ConcurrentHashMap實現原理

ConcurrentHashMap的目標是實現支持高併發、高吞吐量的線程安全的HashMap,數據結構是使用多個Segment組成的數組,每一個Segment包含了一個HashEntry數組的hash表,每一個Segment有自己的操作,只對自己的Segment進行鎖定,其性能好於對整個hash表上鎖的HashTable。Segment使用的鎖機制是繼承ReentranntLock,ReentrantLock的事項比synchronized在多線程下的總體開銷小。


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