syc鎖的優化後各種概念雜選

文章在:E:(我的網盤\我的筆記)\學習文檔子目錄壓縮\併發技術\J2SE多線程基礎\鎖\syc鎖的優化後各種概念雜選.doc

以下是jdk syc優化後的,優化前syc都是直接就是重量級鎖

重量級鎖的需要操作系統分配鎖資源,每次都需要線程競爭一下,未獲取到鎖資源的線程會進入JVM隊列waits中,等待已獲得鎖的線程釋放後,JVM喚醒在隊列排隊的線程再次競爭

 

CAS無鎖(自旋鎖,輕量級鎖):java大部分在atomic包下,耗CPU

CAS原理:內存值V,舊的預期值A,要修改的新值B 線程先從內存值V讀取出來賦予舊的預期值A,基於A構造新值B,然後進入CPU操作內存改內存值V爲新值B(在JAVA中是compare方法,在c++進入後彙編最終指令是luck CMPXCHG,這裏是CPU操作內存時需要鎖總線的,即只有一個CPU一個線程能進行操作,否則會出現ABA問題)

 

偏向鎖-(默認啓動時間爲4秒,也就是會延遲4秒)>輕量級鎖->重量級鎖 轉變

偏向鎖(通過直接改變對象佈局的4塊 8位2進制(百度jol)組成的第一塊markword的末三位來識別無鎖0和有鎖1(001無鎖,101偏向鎖,00輕量級鎖,01重量級鎖,11GC標記信息,如下圖),這樣就不用去操作系統申請鎖了,速度當然比重量級鎖快)->輕量級鎖(當偏向鎖除了已獲得鎖的線程外還有兩個B,C以上的線程競爭偏向鎖,那麼就會鎖升級爲輕量級鎖--即B,C兩個線程一直自旋直到A將鎖識別碼從1改成0)->重量級鎖(當自旋的線程競爭加劇,即自旋的線程過多,CPU佔用較高時,JK1.6以後JVM會自動優化升級爲重量級鎖,及線程不再自旋,而是有JVM放入waits隊列中)

 

 

 

 

偏向鎖與CAS無鎖(自旋鎖,輕量級鎖)的優劣

因爲偏向鎖會默認一開始無競爭,所有會4秒後啓動,因此如果知道一開始就會有2個以上線程競爭,還不如直接開啓自旋鎖

 

CAS無鎖(自旋鎖,輕量級鎖)與重量級鎖,sync,lock等的優劣
當線程處理效率高,不會一直有很多線程訪問資源時,可用自旋鎖,因爲一直自旋很耗CPU

相反還不如直接用重量級鎖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章