Java鎖實現

我們都使用第三方庫作為開發的正常部分。 通常,我們無法控制其內部。 JDK隨附的庫是一個典型示例。 這些庫中的許多庫都使用鎖來管理競爭。
JDK鎖具有兩種實現。 人們使用原子CAS樣式指令來管理索賠過程。 CAS指令往往是最昂貴的CPU指令類型,并且在x86上具有內存排序語義。 鎖通常是無競爭的,這會導致可能的優化,從而可以使用避免使用原子指令的技術將鎖偏向無競爭的線程。 這種偏向使得理論上的鎖定可以被同一線程快速重新獲得。 如果該鎖最終被多個線程爭用,則該算法將從偏見中恢復過來,并使用原子指令退回到標準方法。 偏向鎖定已成為Java 6的默認鎖定實現 。
在遵守單一作者原則時,偏向鎖定應該是您的朋友。 最近,當使用套接字API時,我決定衡量鎖定成本,并對結果感到驚訝。 我發現我的無競爭線程所產生的開銷比我預期的要多。 我匯總了以下測試,以比較Java 6中可用的當前鎖實現的成本。
考試
為了進行測試,我將在鎖中增加一個計數器,并增加鎖中競爭線程的數量。 對于Java可用的3種主要鎖實現,將重復此測試:
  1. Java語言監視器上的原子鎖定
  2. Java語言監視器上的偏向鎖定
  3. Java 5中隨java.util.concurrent包引入的ReentrantLock 。
我還將在最新的3代Intel CPU上運行測試。 對于每個CPU,我將執行測試,直到核心計數將支持的最大并發線程數為止。
該測試是在64位Linux(Fedora Core 15)和Oracle JDK 1.6.0_29上進行的。

編碼

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.CyclicBarrier;import static java.lang.System.out;public final class TestLocks implements Runnable
{public enum LockType { JVM, JUC }public static LockType lockType;public static final long ITERATIONS = 500L * 1000L *1000L;public static long counter = 0L;public static final Object jvmLock = new Object();public static final Lock jucLock = new ReentrantLock();private static int numThreads;private static CyclicBarrier barrier;public static void main(final String[] args) throws Exception{lockType = LockType.valueOf(args[0]);numThreads = Integer.parseInt(args[1]);runTest(numThreads); // warm upcounter = 0L;final long start = System.nanoTime();runTest(numThreads);final long duration = System.nanoTime() - start;out.printf("%d threads, duration %,d (ns)\n", numThreads, duration);out.printf("%,d ns/op\n", duration / ITERATIONS);out.printf("%,d ops/s\n", (ITERATIONS * 1000000000L) / duration);out.println("counter = " + counter);}private static void runTest(final int numThreads) throws Exception{barrier = new CyclicBarrier(numThreads);Thread[] threads = new Thread[numThreads];for (int i = 0; i < threads.length; i++){threads[i] = new Thread(new TestLocks());}for (Thread t : threads){t.start();}for (Thread t : threads){t.join();}}public void run(){try{barrier.await();}catch (Exception e){// don't care}switch (lockType){case JVM: jvmLockInc(); break;case JUC: jucLockInc(); break;}}private void jvmLockInc(){long count = ITERATIONS / numThreads;while (0 != count--){synchronized (jvmLock){++counter;}}}private void jucLockInc(){long count = ITERATIONS / numThreads;while (0 != count--){jucLock.lock();try{++counter;}finally{jucLock.unlock();}}}
}

編寫測試腳本:

設置-x
對于{1..8}中的i; 做Java -XX:-UseBiasedLocking TestLocks JVM $ i; 做完了 對于{1..8}中的i; 做Java -XX:+ UseBiasedLocking TestLocks JVM $ i; 做完了 對于{1..8}中的i; 做Java TestLocks JUC $ i; 做完了

結果

圖1
圖2
圖3
在現代英特爾處理器上,偏置鎖定不再應該是默認的鎖定實現。 我建議您使用-XX:-UseBiasedLocking JVM選項來評估您的應用程序和實驗,以確定是否可以從針對無競爭情況使用基于原子鎖的算法中受益。

觀察結果
  1. 在無競爭的情況下,有偏鎖比原子鎖貴10%。 似乎對于最近的CPU代來說,原子指令的成本比偏向鎖的必要內務處理要少。 在Nehalem之前,鎖定指令會在內存總線上聲明一個鎖定以執行這些原子操作,每條操作將花費100個以上的周期。 自Nehalem以來,原子指令可以在CPU內核本地進行處理,并且在執行內存排序語義時不需要等待存儲緩沖區為空時,通常只需花費10-20個周期。
  2. 隨著爭用的增加,語言監視器鎖定將Swift達到吞吐量限制,而與線程數無關。
  3. 與使用同步的語言監視器相比,ReentrantLock提供了最佳的無競爭性能,并且隨著爭用的增加,擴展性也顯著提高。
  4. 當2個線程競爭時,ReentrantLock具有降低性能的奇怪特征。 這值得進一步調查。
  5. 當競爭線程數較少時,Sandybridge遭受原子指令增加的延遲 ,這在上一篇文章中已詳細介紹。 隨著競爭線程數的不斷增加,內核仲裁的成本趨于占主導地位,而Sandybridge則顯示出其在提高內存吞吐量方面的優勢。
結論
在開發自己的并發庫時,如果無鎖替代算法不是可行的選擇,則建議使用ReentrantLock而不是使用synced關鍵字,因為它在x86上具有明顯更好的性能。
更新2011年11月20日
Dave Dice指出,未對JVM啟動的前幾秒中創建的鎖實施偏向鎖。 我將在本周重新運行測試并發布結果。 我收到了更多質量反饋,表明我的結果可能無效。 微型基準測試可能會很棘手,但是在大型應用中衡量自己的應用程序的建議仍然存在。
考慮到Dave的反饋,可以在此后續博客中查看測試的重新運行。
參考:來自我們的JCG合作伙伴 Martin Thompson的Java鎖實現,來自Mechanical Sympathy Blog。

翻譯自: https://www.javacodegeeks.com/2012/07/java-lock-implementations.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371768.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一鍵生成APP官網

只需要輸入蘋果下載地址&#xff0c;安卓市場下載地址&#xff0c;或者內測下載地址&#xff0c;就能一鍵生成APP的官網&#xff0c;方便在網上推廣。 好推APP官網 www.hotapp.cn/app 轉載于:https://www.cnblogs.com/likwo/p/6223889.html

python 字符ab+字符c 2_“ab”+”c”*2 結果是: (1.3分)_學小易找答案

【判斷題】藥物效應動力學簡稱藥效學,是研究藥物對機體的作用?【單選題】以下關于Python語言中“縮進”說法正確的是:?????????????????????????????????????????????????????????????????????????…

數據結構及算法 -- 目錄

排序算法 -- 目錄 啦啦啦轉載于:https://www.cnblogs.com/ClassNotFoundException/p/7122848.html

Spring MVC集成測試

在Spring MVC中對控制器進行集成測試的一種方法是使用Spring提供的集成測試支持。 對于Junit4&#xff0c;此支持包括一個名為SpringJunit4ClassRunner的自定義Junit Runner和一個用于加載相關Spring配置的自定義批注。 樣本集成測試將遵循以下原則&#xff1a; RunWith(Spri…

spark 快速入門 java API

Spark的核心就是RDD&#xff0c;對SPARK的使用入門也就是對RDD的使用&#xff0c;包括action和transformation 對于Java的開發者&#xff0c;單單看文檔根本是沒有辦法理解每個API的作用的&#xff0c;所以每個SPARK的新手&#xff0c;最好按部就班直接學習scale, 那才是一個高…

網頁設計上機考試原題_Dreamweaver上機考試題目dreamweaver試題庫網頁制作試題.doc...

網頁設計上機考試題集注意&#xff1a;所有題目中涉及的素材都在考試文件夾內&#xff0c;其中圖片在下面的pic文件夾中&#xff0c;音樂、flash在media文件夾。1) 在1.html中的頂部添加一個錨點鏈接&#xff0c;點擊之能立即到達頁面最底端。2) 將1.html中的所有鏈接的默認樣式…

35數據結構與算法分析之---最短路徑

本系列是閱讀《數據結構與算法應用實踐教程》第2版 主編 李文書 北京大學出版社 的讀書筆記&#xff0c;加上自己的理解&#xff0c;更多的是學習的記錄與反思&#xff0c;如有不妥&#xff0c;歡迎指正&#xff0c;非常感謝。轉載于:https://www.cnblogs.com/guochaoxxl/p/712…

Quartz 2 Scheduler示例

Quartz是一個開源作業調度框架。 它可用于管理和計劃應用程序中的作業。 步驟1&#xff1a;建立已完成的專案 創建一個Maven項目&#xff0c;如下所示。 &#xff08;可以使用Maven或IDE插件來創建它&#xff09;。 步驟2&#xff1a;圖書館 Quartz依賴項已添加到Maven的po…

sql server 2008 com.microsoft.sqlserver.jdbc.SQLServerException: 通過端口 1433 連接到主機

原內容搬遷到了新網站&#xff0c;給你帶來的不便&#xff0c;敬請諒解&#xff01; 》 http://www.suanliutudousi.com/2017/08/28/sql-server-2008-com-microsoft-sqlserver-jdbc-sqlserverexception-%E9%80%9A%E8%BF%87%E7%AB%AF%E5%8F%A3-1433-%E8%BF%9E%E6%8E%A5%E5%88%B0…

如何通過網線連接兩臺電腦快速傳輸數據?

介紹 我們經常需要拷貝文件會用到類似U盤等工具&#xff0c;但我們有時在傳輸大文件時又苦于沒有&#xff0c;那么大內存的轉存工具。這時候我們就可以通過一條小小的網線連接兩臺電腦&#xff0c;形成一個小的局域網傳輸數據&#xff0c;因為是通過網線傳輸&#xff0c;所以傳…

30分鐘內使用MongoDB

最近&#xff0c;我被NoSQL錯誤咬住了-或是我的同事Mark Atwell提出的“燃燒在哪里&#xff01;” 運動。 盡管我無意于在不久的將來或可預見的將來回避友好的“ SELECT ... WHERE”&#xff0c;但我確實設法弄懂了一些代碼。 在本文中&#xff0c;我分享了我在NoSQL世界中首次…

【Django】--ModelForm組件

ModelForm a.class Meta:model,#對應Model的  fieldsNone,#字段  excludeNone,#排除字段  labelsNone,#提示信息  help_texts None,#幫助提示信息  widgets None,#自定義插件  error_messages None,#自定義錯誤信息(整體錯誤信息from django.core.exceptions im…

mysql實際綜合案例_Mysql綜合案例

Mysql綜合案例考核要點&#xff1a;創建數據表、單表查詢、多表查詢已知&#xff0c;有一個學生表student和一個分數表score&#xff0c;請按要求對這兩個表進行操作。student表和score分數表的表結構分別如表1-1和表1-2所示。表1-1student表結構字段名數據類型主鍵外鍵非空唯一…

2012年I / O之后

從注冊到贈品&#xff0c;每年的I / O瘋狂都在不斷發展。 在今年20分鐘內被出售&#xff0c;并沒有阻止Google贈送更多的東西。 以這種速度并有望在明年發布Google Glass&#xff0c;明年注冊很可能會變得更加混亂&#xff01; 因此&#xff0c;Google&#xff0c;請停止提供免…

h5啟動原生APP總結

許久沒有寫博客了&#xff0c;最近有個H5啟動APP原生頁面的需求&#xff0c;中間遇上一些坑&#xff0c;看了些網上的實現方案&#xff0c;特意來總結下 一、需要判斷客戶端的平臺以及是否在微信瀏覽器中訪問 1、客戶端判斷 在啟動APP時&#xff0c;Android和IOS系統處理的方式…

mysql導入創建表空間_oracle創建表空間 用戶 數據庫導入和導出(轉)

已經安裝orcale 9i 和pl/sql(6.0)OracleJobSchedulerORCL、OracleOraDb10g_home1iSQL*PlusOracleOraDb10g_home1TNSListenerOracleServiceORCL第一個是oem控制臺服務進程第二個是定時器和isql*plus的服務進程第三個是監聽器的服務進程最后是數據庫服務進程1. pl/sql客戶機安裝后…

什么時候使用Apache Camel?

Apache Camel是JVM / Java環境中我最喜歡的開源框架之一。 它可以輕松集成使用多種協議和技術的不同應用程序。 本文介紹了何時使用Apache Camel以及何時使用其他替代方法。 問題&#xff1a;企業應用程序集成&#xff08;EAI&#xff09; 由于新產品和新應用&#xff0c;幾乎…

念整數

念整數&#xff08;5分&#xff09;題目內容&#xff1a; 你的程序要讀入一個整數&#xff0c;范圍是[-100000,100000]。然后&#xff0c;用漢語拼音將這個整數的每一位輸出出來。 如輸入1234&#xff0c;則輸出&#xff1a; yi er san si注意&#xff0c;每個字的拼音之間有一…

python 比較運算符放在列表中_在Python3中將運算符放在列表中

我想把操作符作為一個列表&#xff0c;然后從列表中調用一個元素作為操作符。在如果我沒有在運算符周圍加引號&#xff0c;那么列表中逗號的語法錯誤&#xff1a;File "p22.py", line 24cat [,-,*]^SyntaxError: invalid syntax如果我把引語放在周圍&#xff0c;那么…

軟工個人總結

目錄 一、個人提升二、寫下屬于自己的人月神話三、對下一屆、后來人、自己的建議四、我的團隊——Clover五、關于代碼質量六、學過軟件工程&#xff1f;七、自我介紹八、個性發揮一、個人提升 1. 開學初的目標 希望通過團隊合作領會團隊合作的內在精神&#xff0c;希望在分工完…