併發程式設計 鎖的公升級流程

2021-10-06 06:02:36 字數 754 閱讀 7778

偏向鎖狀態

一、檢查markword裡面是不是放的自己的threadid,如果是,表示當前執行緒處於「偏向鎖」

輕量級鎖狀態

二、如果markword裡不是自己的threadid,鎖公升級,用cas執行切換,新的執行緒根據markword裡面現有的threadid,通知之前執行緒暫停,之前執行緒將markword的內容置為空。

三、兩個執行緒都把鎖物件的hashcode複製到自己新建的用於儲存鎖的記錄空間,接著開始通過cas操作,把鎖物件的markword的內容修改為自己新建的記錄空間的位址的方式競爭markword

四、第三步中成功執行cas的獲得資源,失敗的則進入自旋

五、自旋的執行緒在自旋過程中,成功獲得資源,則處於輕量級狀態,如果自旋失敗,進入下一步

重量級鎖狀態

六、進入重量級鎖的狀態,這個時候,自旋的執行緒進行阻塞,等待之前執行緒執行完成並喚醒自己

附:各種鎖的優缺點

優點缺點

使用場景

偏向鎖加鎖和解鎖不需要額外的消耗,和執行非同步方法比僅存在納秒級的差距

如果執行緒間存在鎖競爭,會帶來額外的鎖撤銷的消耗

使用於只有乙個執行緒訪問同步塊場景

輕量級鎖

競爭的執行緒不會阻塞,提高了程式的響應速度

如果始終得不到鎖,競爭的執行緒使用自旋會消耗cpu

追求響應時間。同步塊執行速度非常快

重量級鎖

執行緒競爭不適用自旋,不會消耗cpu

執行緒阻塞,響應時間緩慢

追求吞吐量。同步塊執行速度較長

iOS併發程式設計 鎖

import import import import define iterations 1024 1024 32 void testlock now cfabsolutetimegetcurrent printf nslock f sec n now then then cfabsoluteti...

程式設計中的併發與鎖

學習筆記 頻寬比較低的裝置 usb 滑鼠 鍵盤 高速訪問 頻寬高的裝置 5ghz 每秒鐘進行5g次基礎指令運算 乙個cpu晶元可以整合多個 cpu 核心,可以並行處理任務。一般核心數 執行緒數 cpu的快取是對主存的快取記憶體。uptime 電腦執行了多長時間 負載 資源排程管理的最小單位 程序中的...

Java併發程式設計基礎 鎖

1 悲觀鎖和樂觀鎖 悲觀鎖 在sql語句末尾加上for update 樂觀鎖 在sql的where語句中新增version條件 update tablel set name and version 樂觀鎖並不會使用資料庫提供的鎖機制,一般在表中新增version 宇段或者使用業務 狀態來實現。樂觀鎖...