偏向鎖狀態
一、檢查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 宇段或者使用業務 狀態來實現。樂觀鎖...