java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法
java 并發計數器
我只是買了新玩具,而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 并發計數器
總結
以上是生活随笔為你收集整理的java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寝室健康小常识
- 下一篇: 42所双一流大学名单(42双一流高校排名