(一)Synchronized鎖公升級的大致過程

2021-10-10 14:08:03 字數 1356 閱讀 8694

因為synchronized是跑在jvm上,jvm對於作業系統的核心來說,就是乙個普通的應用程式,synchronized想要申請一把鎖,需要交給boss(作業系統核心態)來做,做好後反饋給你,所以叫重量級所

- 其中的偏向鎖和輕量級鎖是在使用者態完成的,不需要經過boss(作業系統核心)

- 重量級鎖是需要讓boss幫我管理多執行緒

偏向鎖自己直接把id往上一貼就可以,偏向第乙個持有這個鎖的執行緒,基本上就乙個鎖,沒有鎖的競爭。比如jdk中的vector和stringbuffer,他們兩個特點就是執行緒安全,因為內部加鎖了。

把id往上一貼就可以什麼意思?

說白了就是改變物件的markwork,將自己的名字貼到markwork上

輕量級鎖

也就是我們所說的自旋鎖(cas----compare and set 比較並設定),偏向鎖一開始沒有競爭,後來執行緒多了之後,開始競爭,把原來的id撕下來,以cas的方式開始競爭,搶著貼自己的id,誰貼成功了,鎖就算誰的;不成功的就自旋,自旋就是迴圈檢查有沒有執行緒持有這個鎖,如果沒有就上自己的鎖。自旋鎖適合於執行緒少或者乙個執行緒占用時間少的多執行緒,因為自旋是不斷進行while迴圈,消耗cpu

重量級鎖自旋鎖競爭越來越激烈,消耗大量cpu,就需要boss(作業系統核心)。boss怎樣管理呢?

排隊!都不要自旋了。把沒有搶到鎖的執行緒扔到佇列裡等待(wait()操作),什麼時候鎖讓出來了,這時候分兩種情況

- 公平鎖,作業系統使多個執行緒按照申請鎖的順序去獲得鎖,永遠都是佇列的第一位才能得到鎖。

- 非公平鎖,佇列裡面執行緒一起去搶,誰搶到算誰的

怎樣區分鎖的狀態,根據markwork的***鎖標誌位和偏向鎖位***

鎖標誌位00-----輕量級鎖 (或自旋鎖或無鎖 無鎖就是自旋鎖)

鎖標誌位01-----兩種情況(下面)

鎖標誌位10-----重量級鎖

鎖標誌位11------gc標記資訊,被**

若是01------代表兩種情況,再看偏向鎖位

偏向鎖位0-------無鎖態

偏向鎖位1--------偏向鎖

執行緒鎖 synchronized

使用 synchronized解決執行緒同步問題相比較nslock要簡單一些,日常開發中也更推薦使用此方法。首先選擇乙個物件作為同步物件 一般使用self 然後將 加鎖 爭奪資源的讀取 修改 放到 塊中。synchronized中的 執行時先檢查同步物件是否被另乙個執行緒占用,如果占用該執行緒就會處...

執行緒之 鎖 synchronized鎖

多執行緒中有寫程式是由一寫bug的,學習執行緒鎖,很經典的例子,買票案例 有a,b,c三個視窗,同時售賣100張票,最後可能會出現賣了重複的票,或者多賣了,賣超了等執行緒不安全問題 看乙個執行緒不安全的賣票 小明,小張,小王同時去買票,就會出現上面的執行緒不安全問題,因為,視窗1賣了1張票,而另外兩...

synchronized內建鎖詳解

synchronized內建鎖詳解 多執行緒訪問同一共享可變資源的情況下,會出現執行緒不安全問題,經典案例購買火車票 public class testthread2 public void getticket system.out.println thread.currentthread getn...