<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網(wǎng)

      掃一掃關(guān)注

      當前位置: 首頁 » 企業(yè)資訊 » 行業(yè) » 正文

      Synchronized_中的_4_個優(yōu)化,

      放大字體  縮小字體 發(fā)布日期:2021-09-10 01:05:41    作者:企資小編    瀏覽次數(shù):54
      導讀

      synchronized 在 JDK 1.5 時性能是比較低的,然而在后續(xù)的版本中經(jīng)過各種優(yōu)化迭代,它的性能也得到了前所未有的提升,之前說到過鎖膨脹對 synchronized 性能的提升,然而它也只是“眾多” synchronized 性能優(yōu)化方案

      synchronized 在 JDK 1.5 時性能是比較低的,然而在后續(xù)的版本中經(jīng)過各種優(yōu)化迭代,它的性能也得到了前所未有的提升,之前說到過鎖膨脹對 synchronized 性能的提升,然而它也只是“眾多” synchronized 性能優(yōu)化方案中的一種,那么我們本文就來盤點一下 synchronized 的核心優(yōu)化方案。

      synchronized 核心優(yōu)化方案主要包含以下 4 個:

      1. 鎖膨脹
      2. 鎖消除
      3. 鎖粗化
      4. 自適應(yīng)自旋鎖

      1.鎖膨脹

      我們先來回顧一下鎖膨脹對 synchronized 性能的影響,所謂的鎖膨脹是指 synchronized 從無鎖升級到偏向鎖,再到輕量級鎖,最后到重量級鎖的過程,它叫做鎖膨脹也叫做鎖升級。

      JDK 1.6 之前,synchronized 是重量級鎖,也就是說 synchronized 在釋放和獲取鎖時都會從用戶態(tài)轉(zhuǎn)換成內(nèi)核態(tài),而轉(zhuǎn)換的效率是比較低的。但有了鎖膨脹機制之后,synchronized 的狀態(tài)就多了無鎖、偏向鎖以及輕量級鎖了,這時候在進行并發(fā)操作時,大部分的場景都不需要用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)換了,這樣就大幅的提升了 synchronized 的性能。

      2.鎖消除

      很多人都了解 synchronized 中鎖膨脹的機制,但對接下來的 3 項優(yōu)化卻知之甚少,這樣會在面試中錯失良機,那么我們本文就把這 3 項優(yōu)化單獨拎出來講一下吧。

      鎖消除指的是在某些情況下,JVM 虛擬機如果檢測不到某段代碼被共享和競爭的可能性,就會將這段代碼所屬的同步鎖消除掉,從而到底提高程序性能的目的。

      鎖消除的依據(jù)是逃逸分析的數(shù)據(jù)支持,如 StringBuffer 的 append() 方法,或 Vector 的 add() 方法,在很多情況下是可以進行鎖消除的,比如以下這段代碼:

      public String method() {    StringBuffer sb = new StringBuffer();    for (int i = 0; i < 10; i++) {        sb.append("i:" + i);    }    return sb.toString();}

      以上代碼經(jīng)過編譯之后的字節(jié)碼如下:

      從上述結(jié)果可以看出,之前我們寫的線程安全的加鎖的 StringBuffer 對象,在生成字節(jié)碼之后就被替換成了不加鎖不安全的 StringBuilder 對象了,原因是 StringBuffer 的變量屬于一個局部變量,并且不會從該方法中逃逸出去,所以此時我們就可以使用鎖消除(不加鎖)來加速程序的運行。

      3.鎖粗化

      鎖粗化是指,將多個連續(xù)的加鎖、解鎖操作連接在一起,擴展成一個范圍更大的鎖。

      我只聽說鎖“細化”可以提高程序的執(zhí)行效率,也就是將鎖的范圍盡可能縮小,這樣在鎖競爭時,等待獲取鎖的線程才能更早的獲取鎖,從而提高程序的運行效率,但鎖粗化是如何提高性能的呢?

      沒錯,鎖細化的觀點在大多數(shù)情況下都是成立了,但是一系列連續(xù)加鎖和解鎖的操作,也會導致不必要的性能開銷,從而影響程序的執(zhí)行效率,比如這段代碼:

      public String method() {    StringBuilder sb = new StringBuilder();    for (int i = 0; i < 10; i++) {        // 偽代碼:加鎖操作        sb.append("i:" + i);        // 偽代碼:解鎖操作    }    return sb.toString();}

      這里我們不考慮編譯器優(yōu)化的情況,如果在 for 循環(huán)中定義鎖,那么鎖的范圍很小,但每次 for 循環(huán)都需要進行加鎖和釋放鎖的操作,性能是很低的;但如果我們直接在 for 循環(huán)的外層加一把鎖,那么對于同一個對象操作這段代碼的性能就會提高很多,如下偽代碼所示:

      public String method() {    StringBuilder sb = new StringBuilder();    // 偽代碼:加鎖操作    for (int i = 0; i < 10; i++) {        sb.append("i:" + i);    }    // 偽代碼:解鎖操作    return sb.toString();}

      鎖粗化的作用:如果檢測到同一個對象執(zhí)行了連續(xù)的加鎖和解鎖的操作,則會將這一系列操作合并成一個更大的鎖,從而提升程序的執(zhí)行效率。

      4.自適應(yīng)自旋鎖

      自旋鎖是指通過自身循環(huán),嘗試獲取鎖的一種方式,偽代碼實現(xiàn)如下:

      // 嘗試獲取鎖while(!isLock()){    }

      自旋鎖優(yōu)點在于它避免一些線程的掛起和恢復(fù)操作,因為掛起線程和恢復(fù)線程都需要從用戶態(tài)轉(zhuǎn)入內(nèi)核態(tài),這個過程是比較慢的,所以通過自旋的方式可以一定程度上避免線程掛起和恢復(fù)所造成的性能開銷。

      但是,如果長時間自旋還獲取不到鎖,那么也會造成一定的資源浪費,所以我們通常會給自旋設(shè)置一個固定的值來避免一直自旋的性能開銷。然而對于 synchronized 關(guān)鍵字來說,它的自旋鎖更加的“智能”,synchronized 中的自旋鎖是自適應(yīng)自旋鎖,這就好比之前一直開的手動擋的三輪車,而經(jīng)過了 JDK 1.6 的優(yōu)化之后,我們的這部“車”,一下子變成自動擋的蘭博基尼了。

      自適應(yīng)自旋鎖是指,線程自旋的次數(shù)不再是固定的值,而是一個動態(tài)改變的值,這個值會根據(jù)前一次自旋獲取鎖的狀態(tài)來決定此次自旋的次數(shù)。比如上一次通過自旋成功獲取到了鎖,那么這次通過自旋也有可能會獲取到鎖,所以這次自旋的次數(shù)就會增多一些,而如果上一次通過自旋沒有成功獲取到鎖,那么這次自旋可能也獲取不到鎖,所以為了避免資源的浪費,就會少循環(huán)或者不循環(huán),以提高程序的執(zhí)行效率。簡單來說,如果線程自旋成功了,則下次自旋的次數(shù)會增多,如果失敗,下次自旋的次數(shù)會減少。

      總結(jié)

      本文我們介紹了 4 種優(yōu)化 synchronized 的方案,其中鎖膨脹和自適應(yīng)自旋鎖是 synchronized 關(guān)鍵字自身的優(yōu)化實現(xiàn),而鎖消除和鎖粗化是 JVM 虛擬機對 synchronized 提供的優(yōu)化方案,這些優(yōu)化方案最終使得 synchronized 的性能得到了大幅的提升,也讓它在并發(fā)編程中占據(jù)了一席之地。


      作者:Java中文社群
      原文鏈接:juejin/post/6994443415911923719

       
      (文/企資小編)
      免責聲明
      本文僅代表作發(fā)布者:企資小編個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔相應(yīng)責任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

      粵ICP備16078936號

      微信

      關(guān)注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯(lián)系
      客服

      聯(lián)系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

      周一至周五: 09:00 - 18:00

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 在线免费观看h片| 国产成人亚洲欧美电影| 无限资源视频手机在线观看| 强行交换配乱婬bd| 国产swag剧情在线观看| 久久久久久亚洲精品中文字幕 | 免费看男人j放进女人j色多多 | 免费福利在线视频| 本子库里番acg全彩无遮挡| 扒开老师的蕾丝内裤漫画| 国产精品自在欧美一区| 亚洲欧美综合国产不卡| 91视频免费网址| 欧美日一区二区三区| 国产精品天天干| 亚洲精品在线网站| 中文字幕一二三四区| 福利免费在线观看| 亚洲午夜无码久久| 99精品中文字幕| 波多野结衣上班族| 国产综合久久久久| 亚洲专区在线视频| 黄网站色成年片大免费高清| 日韩在线看片中文字幕不卡| 国产一国产二国产三国产四国产五 | 亚洲欧美精品一中文字幕| 19岁rapper潮水第一集| 最近中文字幕高清中文字幕电影二| 欧美sss视频| 国产日韩欧美911在线观看| 豪妇荡乳1一5| 无码任你躁久久久久久久| 884aa四虎在线| 亚洲毛片免费看| 国产精品9999久久久久仙踪林| 永久在线观看www免费视频| 99久久国语露脸精品国产| 亚洲国产精品xo在线观看| 无码办公室丝袜OL中文字幕| 玉蒲团之偷情宝鉴电影|