Java併發機制的底層實現原理

併發編程的挑戰

  1. 上下文切換;
  2. 死鎖問題:避免一個線程同時獲取多個鎖;避免一個線程在鎖內同時佔用多個資源,儘量保證每個鎖只佔用一個資源;嘗試使用定時鎖;
  3. 資源限制:併發編程,執行速度受限於硬件資源和軟件資源;

併發編程的底層原理

volatile的應用(輕量級的synchronized)

定義:保證共享變量的“可見性”,當一個線程修改一個變量時,另外一個線程能讀到這個修改的值;

volatile的兩條實現原則:

  1. Lock前綴指令會引起處理器緩存會寫到內存;
  2. 一個處理器的緩存回寫到內存會導致其它處理器的緩存無效;

volatile的優化:通過一種追加字節的方式優化隊列的出隊和入隊的性能;

       原因:一些處理的高速緩衝行是64個字寬,不支持部分緩衝行,即隊列的頭結點和尾節點都不足64字節的話,處理會將它們都讀到一個高速緩衝中,在多處理器每個處理器都會緩存同樣的頭尾節點,當一個處理器試圖修改頭節點時,會將整個緩衝行鎖定,那麼在緩存一致性的作用下,導致其他處理器不能訪問自己高速緩存中的尾節點,影響效率;

      不適用的場景:

  1. 緩衝行非64字節寬的處理器;
  2. 共享變量不會被頻繁的寫;
synchronized的實現原理與應用(重量級)

形式:

  1. 對於普通方法,鎖是當前實例對象;
  2. 對於靜態同步方法,鎖是當前類的Class對象;
  3. 對於同步方法塊,鎖是Synchronized括號裏配置的對象;

鎖的優缺點對比:

鎖的優缺點對比
優點缺點    適用場景
偏像鎖加鎖和解鎖不需要額外的消耗,和執行非同步的方法相比僅存在納米級的差距線程間存在鎖競爭,會帶來額外的鎖撤銷的消耗一個線程訪問同步塊的場景
輕量級鎖競爭的鎖不會阻塞,提高了程序的響應速度如果始終得不到鎖競爭的線程,使用自旋會消耗CPU

追求響應時間

同步塊執行速度非常快

重量級鎖線程競爭不使用自旋,不會消耗CPU線程阻塞,響應時間緩慢

追求吞吐量

同步塊執行速度較長

原子操作的實現原理

定義:不可被中斷的一個或一系列操作;

實現機制:通過總線鎖保證原子性;通過緩存鎖保證原子性;

java中實現原子操作:通過鎖和循環CAS的方式;

        CAS的問題:

  1. ABA問題;
  2. 循環時間長開銷大;
  3. 只能保證一個共享變量的原子操作;


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