真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

Java并發(fā)編程—鎖升級-創(chuàng)新互聯

文章目錄
  • 鎖升級原理
  • 鎖的升級的目的
  • 鎖的四種狀態(tài)
  • 偏向鎖
  • 輕量級鎖
  • 重量級鎖
  • 輕量級鎖和重量級鎖的對比
  • 偏向鎖的設置
    • 開啟偏向鎖的方式:
  • 自旋鎖自旋多少次競爭不到后會升級到重量級鎖?
  • 為什么有了自旋鎖還需要重量級鎖?
  • 偏向鎖是否一定比自旋鎖效率高?

————————————————————————————————————

創(chuàng)新互聯是一家專業(yè)提供敘永企業(yè)網站建設,專注與網站建設、成都網站制作、H5高端網站建設、小程序制作等業(yè)務。10年已為敘永眾多企業(yè)、政府機構等服務。創(chuàng)新互聯專業(yè)網站建設公司優(yōu)惠進行中。鎖升級原理
  • 鎖一開始并不是進入到重量級狀態(tài),一開始是在推廣階段是偏向鎖,再升級到輕量級鎖,再升級到重量級鎖。在推廣階段請求較少,用偏向鎖就能滿足要求

synchronized鎖升級原理:
在鎖對象的對象頭里面有一個threadid字段,在第一次訪問的時候threadid為空, jvm 讓其持有偏向鎖,并將threadid 設置為其線程id,再次進入的時候會先判斷。threadid是否與其線程id一致,如果一致則可以直接使用此對象,如果不一致,則升級偏向鎖為輕量級鎖,通過自旋循環(huán)一定次數來獲取鎖,執(zhí)行一定次數之后,如果還沒有正常獲取到要使用的對象,此時就會把鎖從輕量級升級為重量級鎖!此過程就構成了synchronized鎖的升級。

鎖的升級的目的

鎖的升級的目的:
鎖升級是為了減低了鎖帶來的性能消耗。在Java 6之后優(yōu)化 synchronized的實現方式,使用了偏向鎖升級為輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。

鎖的四種狀態(tài)

上面講到鎖有四種狀態(tài),并且會因實際情況進行膨脹升級,其膨脹方向是:
無鎖——>偏向鎖——>輕量級鎖——>重量級鎖,并且膨脹方向不可逆。

偏向鎖

一句話總結它的作用: 減少統一線程獲取鎖的代價。在大多數情況下,鎖不存在多線程競爭,總是由同一線程多次獲得,那么此時就是偏向鎖。

  • 優(yōu)點: 加鎖和解鎖不需要額外的消耗,和執(zhí)行非同步方法相比僅存在納秒級別的差距
  • 缺點: 如果線程之間存在競爭,會帶來額外的鎖撤銷的消耗
  • 使用場景: 適用于一個線程訪問同步塊的場景
  • 核心思想: 如果一個線程獲得了鎖,那么鎖就進入偏向模式,此時Mark word的結構也就變?yōu)槠蜴i結構,當該線程再次請求鎖時,無需再做任何同步操作,即獲取鎖的過程只需要檢查Mark word的鎖標記位為偏向鎖以及當前線程ID等于Mark word的ThreadID即可,這樣就省去了大量有關鎖申請的操作。
輕量級鎖
  • 輕量級鎖是由偏向鎖升級而來,當存在第二個線程申請同一個鎖對象時,偏向鎖就會立即升級為輕量級鎖。
  • 注意這里的第二個線程只是申請鎖,不存在兩個線程同時競爭鎖,可以是一前一后地交替執(zhí)行同步塊。
  • 自旋: 沒有競爭到資源的鎖,在極短的時間內查看一次資源
  • 好處: 加鎖的速度快,能立刻查看到資源被解鎖并加上鎖
  • 缺點: 沒競爭到資源的線程也會自旋,會浪費cpu開銷,損害cpu利用率
  • 使用場景: 自旋鎖適合線程較少,少量并發(fā)的操作,因為這樣浪費的自旋操作少
重量級鎖
  • 重量級鎖是由輕量級鎖升級而來,當同一時間有多個線程競爭鎖時,鎖就會被升級成重量級鎖,此時其申請鎖帶來的開銷也就變大。
  • 流程: 競爭成功的加鎖,競爭失敗的進入阻塞隊列不參與競爭,cpu全力執(zhí)行競爭成功的任務,這樣cpu利用率比較高;釋放鎖之后會發(fā)一個通知,阻塞隊列的線程出來進入就緒隊列,再一次進行競爭,競爭失敗的再進入阻塞隊列。
  • 好處: 競爭失敗的不會浪費cpu,并發(fā)量多的時候,使用重量級鎖,cpu浪費率比較低,整體性能更好一些;重量級鎖幾乎很少導致cpu浪費
  • 缺點: 線程阻塞,響應時間慢。
  • 使用場景: 適合線程很多,并發(fā)很多,追求吞吐量,同步塊或者同步方法執(zhí)行時間較長的場景。
輕量級鎖和重量級鎖的對比
  • 輕量級鎖競爭的線程不會阻塞,提高程序響應速度;競爭不到線程的鎖也會自旋,會消耗cpu;適合追求響應時間快或同步塊執(zhí)行速度快的場景。
  • 重量級鎖線程競爭失敗的會阻塞,不會自旋,不會消耗cpu;線程阻塞后,之前競爭成功的線程在鎖釋放后需要通知被阻塞的線程,響應時間變慢;適合追求吞吐量或同步塊執(zhí)行速度較長的場景。
偏向鎖的設置 開啟偏向鎖的方式:

—個對象創(chuàng)建時:

  • 如果開啟了偏向鎖(默認開啟),那么對象創(chuàng)建后,markword值為0x05即最后3位為101,這時它的thread、epoch、age都為0。
  • 偏向鎖是默認是延遲的,不會在程序啟動時立即生效,如果想避免延遲,可以加VM參數-xx:BiasedLockingStartupDelay=e來禁用延遲。
  • 如果沒有開啟偏向鎖,那么對象創(chuàng)建后,markword值為0x01即最后3位為001,這時它的 hashcode,age都為0,第一次用到hashcode時才會賦值。
    禁用偏向鎖:
    VM 參數 -XX:-UseBiasedLocking
    特殊情況:
    調用 對象的hashcode方法時,偏向鎖也會被禁用. 這是因為調用了對象的 hashCode,但偏向鎖的對象 MarkWord 中存儲的是線程 id(54位),如果調用 hashCode(31位) 會導致偏向鎖被撤銷。
    撤銷 - 其它線程使用對象:
    當有其它線程使用偏向鎖對象時,會將偏向鎖升級為輕量級鎖。
    批量撤銷:
    當撤銷偏向鎖閾值超過 40 次后,jvm 會這樣覺得,自己確實偏向錯了,根本就不該偏向。于是整個類的所有對象 都會變?yōu)椴豢善虻?,新建的對象也是不可偏向的?/li>
自旋鎖自旋多少次競爭不到后會升級到重量級鎖?
  • Java6之前:默認10次或者cpu核數的一半
  • Java6之后:根據同一個線程上次自旋的時間決定
為什么有了自旋鎖還需要重量級鎖?

自旋是消耗cpu性能的,如果時間過長或者自旋線程過多,cpu會被大量消耗重量級鎖中有隊列waitSet

偏向鎖是否一定比自旋鎖效率高?
  • 單線程的時候偏向鎖效率高
  • 多個線程的時候偏向鎖會涉及鎖撤銷,消耗資源,這時自旋鎖效率高

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧


分享文章:Java并發(fā)編程—鎖升級-創(chuàng)新互聯
文章地址:http://weahome.cn/article/ccehsg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部