1. 程式人生 > >第十三章 線程安全與鎖優化

第十三章 線程安全與鎖優化

thread bsp 互斥 cal 字節 自旋鎖 固定 執行時間 執行

  • 線程安全:當多個線程訪問一個對象時,如果不同考慮這些線程在運行時環境下的調度和替換執行,也不需要進行額外的同步,或者在調用方法進行任何其他的協調操作,調用
    這個對象的行為都可以獲得正確的結果,那這個對象是線程安全的。
  • 線程安全的實現方法:
    • 互斥同步:synchronized關鍵字 monitorenter monitorexit字節碼指令,在執行monitorenter指令時,首先要嘗試獲取對象的鎖,如果該對象未被鎖定或者當前線程已經擁有
      了那個對象的鎖,把鎖的計數器加1,相應的,在執行monitorexit指令時會將鎖計數器減1,當計數器為0時,鎖就被釋放。若果獲取對象鎖失敗,那當前線程就要
      阻塞等待,直到對象鎖被另外一個線程釋放為止。JUC包下ReentrantLock可重入鎖,高級項:
      1.等待可中斷 2.可實現公平鎖 3.綁定多個條件
    • 非阻塞同步(Non-Blocking Synchronization):CAS指令執行時,當且僅當V符合舊預期值A時,處理器甩新值B更新V的值,否則它就不執行更新。CAS V A B
    • 無同步方案:1.可重入代碼 2.線程本地存儲(Thread Local Storage)
  • 鎖優化:
    • 自旋鎖與自適應自旋:互斥同步的時候,對性能影響最大的是阻塞的實現,掛起線程和恢復線程的操作都需要轉入內核態中完成,這些操作給系統的並發性能帶來了很大的壓力。
      同時,共享數據的鎖定狀態只會持續很短的一段時間,為了這段時間去掛起和恢復線程並不值得。如果物理機器有一個以上的處理器,能讓兩個或者以上
      的線程同時並行執行,可以讓後面請求的那個線程“稍等一下”,但是不放棄處理器的執行時間,看看持有鎖的線程是否很快就會釋放鎖。為了讓線程等待,
      只需要讓線程執行一個忙循環(自旋),這就是所謂的自旋鎖。自適應自旋:自旋的時間不在固定,而是由前一次在同一個鎖上的自旋時間及鎖的持有者
      狀態來決定。
    • 鎖消除:
    • 鎖粗化:
    • 輕量級鎖:
    • 偏向鎖:

第十三章 線程安全與鎖優化