二 詳解 synchronize 鎖的公升級

2022-03-26 04:27:16 字數 1435 閱讀 6273

synchronized 鎖定的是乙個物件,執行某段**的時候必須鎖定乙個物件,不鎖定就無法執行

cas :compare and swap/compare and exchange

再舉個例子:

public static void main(string args) throws interruptedexception 

downlatch.countdown();

}});

threads[i] = thread;

}arrays.stream(threads).foreach(f -> f.start());

downlatch.await();

system.out.println(thread.currentthread().getname() + "\t" + integer);

}

上面的**中如果採用 integer++ 這種方式就要進行加鎖,採用 integer.incrementandget() 就不需要加鎖,因為 incrementandget 方法底層就是採用的 cas 實現的,是彙編的一條指令lock cmpxchg 指令。cmpxchg 指令不是原子的,所以需要 lock 指令給 cpu 加鎖,只讓乙個執行緒操作。

偏向鎖、自旋鎖都是在使用者空間完成

重量級鎖都需要向核心空間申請

偏向鎖:

為何會有偏向鎖:因為經過統計大多數情況下 synchronized 方法只有乙個執行緒在執行(如:stringbuffer的一些sync方法,vector的一些sync方法),此時沒必要申請鎖,節約資源

jvm 中偏向鎖是預設開啟的,但是有延遲 4s,可以設定引數修改 1.-xx:biasedlockingstartupdelay=0。對應的就是鎖公升級圖中 new 乙個物件後會有兩種情況。

偏向鎖預設開啟原因是:jvm 虛擬機器自己有一些預設啟動的執行緒,裡面有好多 sync **,這些 sync **啟動時就知道肯定會有競爭,如果使用偏向鎖,就會造成偏向鎖不斷的進行鎖撤銷和鎖公升級的操作,效率較低。

偏向鎖是否一定比自旋鎖效率高:不一定,在明確知道會有多執行緒競爭的情況下,偏向鎖肯定會涉及鎖撤銷,這時候直接使用自旋鎖不涉及鎖撤銷,效果高。

自旋鎖/輕量級鎖:

重量級鎖:

JDK6 synchronize鎖的優化

在共享資料持有時間較短的時候,切換執行緒開銷不值得,通過迴圈等待鎖釋放,不讓出cpu資源。鎖的自旋次數不固定,由前一次在同乙個鎖上的自旋時間及鎖的持有者狀態,也就是成功率來確定自旋次數,達到自旋次數還未獲取鎖就進入阻塞。適應自旋鎖會根據自旋獲取鎖的成功率來調整自旋次數,如果獲取鎖成功率高會調高自旋次...

JUC探索筆記之二 synchronized

在多執行緒環境下,共享資料會存在安全問題,sychronized可以保證同一時只有乙個執行緒能進入 塊或者是這個方法。因此synchronized可以有三種用法 修飾 塊,修飾類中的普通方法 鎖例項物件 修飾靜態方法 鎖類物件 下面來看下作用於普通方法的例子 實驗1 手機類有兩個普通同步方法 發簡訊...

mysql行鎖詳解 詳解MySQL行鎖

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。鎖保證資料併發訪問的一致性 有效性 鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。鎖是mysql在伺服器層和儲存引擎層的的併發控制。mysql中從對資料操作的粒度分為表鎖和行鎖。表鎖是指對一整張表加鎖,一般是 ddl 處理時使用 而行鎖則是鎖定...