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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8 LongAdders:管理并发计数器的正确方法

發布時間:2023/12/3 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8 LongAdders:管理并发计数器的正确方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我只是喜歡新玩具,而Java 8有很多 。 這次我想談談我的最愛之一-并發加法器。 這是一組用于管理由多個線程編寫和讀取的計數器的新類。 新的API有望顯著提高性能,同時仍然使事情變得簡單明了。

自從多核架構問世以來人們一直在管理并發計數器,讓我們看一看到目前為止Java提供了哪些選項,以及與新API相比它們的性能如何。

臟計數器 –這種方法意味著您正在多個線程之間的常規對象或靜態字段中進行寫入/讀取操作。 不幸的是,這有兩個原因。 首先是在Java中,A + = B操作不是原子操作。 如果打開輸出字節碼,將至少看到四條指令-一個用于將堆中的字段值加載到線程堆棧中,第二個用于加載增量,第三個用于添加增量,第四個用于設置結果進入領域。

如果在同一個內存位置同時有多個線程同時執行此操作,則極有可能錯過寫操作,因為一個線程可以覆蓋另一個線程的值(又稱“讀取-修改-寫入”) 。 與此相關的還有另一個討厭的角度,那就是價值的波動性。 下面的更多內容。

這是一個菜鳥錯誤,而且很難調試。 如果您遇到了在您的應用程序中執行此操作的任何人,我想問一個小小的忙。 在數據庫中搜索“ Tal Weiss”。 如果您在那里看到我–刪除我的記錄。 我會更安全的。

同步 -這是最基本的并發習慣用法,它在讀取或寫入值時會阻塞所有其他線程。 當它起作用時,這是將代碼轉換為DMV行的可靠方法。

RWLock –基本Java鎖的這種稍微復雜的版本,使您可以區分更改值和需要阻止其他線程的線程與僅讀取而不需要關鍵部分的線程。 盡管這可能更有效(假設編寫器的數量很少),但這是一個相當不錯的方法,因為在獲取寫鎖時,您將阻止所有其他線程的執行。

易失性 -這個相當容易被誤解的關鍵字實際上指示JIT編譯器取消優化運行時機器代碼,以便其他線程可以立即看到對該字段的任何修改。

這使某些JIT編譯器最喜歡的優化工作失去了按分配分配給內存的順序進行。 再說一次 你聽到了 JIT編譯器可能會更改對字段進行分配的順序。 這種神秘的小策略(也稱為before-before )使它可以最小化程序訪問全局堆所需的次數,同時仍確保您的代碼不受其影響。 偷偷摸摸的…

那么什么時候應該使用易失性計數器? 如果只有一個線程在更新值,而有多個線程在使用它,那么這是一個非常好的策略–根本沒有爭用。

那么為什么不總是問它呢? 因為當一個以上的線程正在更新該字段時,這不能很好地工作。 由于A + = B不是原子的,因此您有重寫別人的寫的風險。 在Java 8之前,您需要使用AtomicInteger。

AtomicInteger-這組類使用CAS(比較和交換)處理器指令來更新計數器的值。 聽起來不錯,不是嗎? 好,是的,不是。 這很有效,因為它利用直接的機器代碼指令來設置該值,而對其他線程的執行影響最小。 缺點是,如果由于與另一個線程的爭用而無法設置該值,則必須重試。 在競爭激烈的情況下,這可能會變成自旋鎖,其中線程必須不斷嘗試并在無限循環中設置該值,直到成功為止。 這不是我們想要的。 輸入帶有LongAdders的Java 8。

Java 8 Adders –這是一個非常酷的新API,我迫不及待想要了解它! 從使用角度來看,它與AtomicInteger非常相似。 只需創建一個LongAdder并使用intValue()和add()即可獲取/設置值。 魔術發生在幕后。

此類的作用是當直接CAS由于爭用而失敗時,它將增量存儲在為該線程分配的內部單元對象中。 然后在調用intValue()時將待處理單元格的值加到總和中。 這減少了返回和CAS或阻止其他線程的需要。 很聰明的東西!

這么好說吧–讓我們看看這只小狗在行動。 我們已經建立了以下基準測試:將計數器重置為零,并開始使用多個線程進行讀取和遞增。 當計數器達到10 ^ 8時停止。 我們在4核i7處理器上運行基準測試。

我們使用總共十個線程來運行基準測試-五個用于寫作,五個用于閱讀,因此我們在這里勢必會引起嚴重的爭論:

  • 請注意,骯臟和易變的風險值都將覆蓋。

  • 代碼在這里可用

底線

  • 并發加法器潔凈室的性能比原子整數提高60-100%
  • 除了鎖定時,添加線程沒有什么區別。
  • 請注意,使用同步鎖或RW鎖會給您帶來巨大的性能損失-慢一個數量級!

如果您已經有機會在代碼中使用這些類,那么我很樂意聽到。

  • 補充閱讀– Brian Goetz關于Java并發性。

翻譯自: https://www.javacodegeeks.com/2014/04/java-8-longadders-the-right-way-to-manage-concurrent-counters.html

總結

以上是生活随笔為你收集整理的Java 8 LongAdders:管理并发计数器的正确方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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