日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我们如何才能让锁变得更好用?

發布時間:2024/4/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我们如何才能让锁变得更好用? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 鎖偏向

? ? ?是一種加鎖操作的優化手段,他的核心思想是:如果一個線程獲得了鎖,那么就進入偏向模式,當這個線程再次請求鎖時,無須在做任何同步操作,因此在幾乎沒有鎖競爭的場合,偏向鎖是比較好的優化效果,因為連續多次極有可能是同一個線程請求同一個相同的鎖,對于鎖競爭比較激烈的場合,其效果不佳,因為競爭激烈的場合,最有可能的情況是每次都是不同的線程來請求相同的鎖,這樣偏向模式就會失效,使用Java虛擬機參數-XX:+UseBiasedLocking可以開啟偏向鎖,

  • 輕量級鎖

? ? ?如果偏向鎖失敗,虛擬機并不會立即掛起線程,他還會使用一種稱為輕量級鎖的優化手段,輕量級鎖的操作也很方便,它只是簡單地將對象頭部作為指針,指向持有鎖的線程堆棧內部,來判斷一個線程是否持有對象鎖,如果線程獲取輕量級鎖成功,則可以順利進入臨界區,如果輕量級鎖加鎖失敗,則表示其他線程搶險爭奪到了鎖,那么當前線程的鎖請求就會膨脹為重量級鎖

  • 自旋鎖

? ? ?鎖膨脹后,虛擬機為了避免線程真實的在操作系統層面掛起,虛擬機還會在做最后的努力,自旋鎖,由于當前線程暫時無法獲得鎖,但什么時候可以獲得鎖是一個未知數,也許幾個cpu時鐘周期,就可以得到鎖,如果這樣,簡單粗暴地掛起線程可能是一種得不償失的操作,因此,系統會進行一次賭注,他會假設在不久的將來,線程可以得到這把鎖,因此,虛擬機會讓當前線程做幾個空循環,在經過若干次循環后,如果可以得到鎖,那么就順利進入臨界區,如果還是得不到鎖,才會真實地將線程在操作系統層面掛起,

  • 鎖消除

? ? ?鎖消除是一種更徹底的鎖優化,Java虛擬機在Jit編譯時,通過對運行上下文的掃描,去除不可能存在共享資源競爭的鎖,通過鎖消除,可以節省毫無意義的請求鎖的時間,如果不可能存在競爭,為什么還要加鎖呢?這是因為咋Java軟件開發過程中,我們必然會使用一些JDK的內置API,比如StringBuffer,Vector等,你在使用的時候,也許根本不會考慮這些對象內部是如何實現的,但是真實環境中,缺不存在競爭,如果虛擬機檢測到這種情況,就會將這些無用的鎖操作去除,

public String[] createStrings() {Vector<String> v = new Vector<>();for (int i = 0; i < 100; i++) {v.add(Integer.toString(i));}return v.toArray(new String[]{}); }

? ? ?鎖消除涉及一項關鍵技術為逃逸分析,所謂逃逸分析就是觀察某一個變量是否會逃出某一個作用域,在本例子中,變量v顯然沒有逃出createStrings()方法之外,以此為基礎,虛擬機才可以大膽地將v內部的加鎖操作去除,

? ? ?逃逸分析必須在-server模式下進行,可以使用-XX:+DoEscapeAnalysis參數打開逃逸分析.使用-XX:+EliminateLocks參數可以打開鎖消除.

在寫代碼時如何優化鎖和提高并發性能

  • 縮小同步代碼塊
  • 盡量不要鎖住方法
  • 減少鎖的次數
  • 避免人為制造“熱點”
  • 鎖中盡量不要包含鎖
  • 選擇合適的鎖類型或合適的工具類

?

總結

以上是生活随笔為你收集整理的我们如何才能让锁变得更好用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。