高并發點贊場景Synchronized、AtomicLong、LongAdder 和 LongAccumulator性能分析

在高并發點贊場景中,我們需要一個高效、線程安全的計數器來記錄點贊數。synchronized、AtomicLong、LongAdder 和 LongAccumulator 都是 Java 中用于實現原子操作的類,但它們的性能在高并發下差異顯著。性能主要取決于線程競爭程度:競爭越高,吞吐量(單位時間處理的操作數)和可擴展性(線程數增加時的性能表現)越關鍵。下面我將基于高并發點贊案例(如百萬級線程同時點贊),逐步分析它們的性能特點和排名。

1. synchronized

  • 原理:使用內置鎖(monitor)確保線程安全。每個點贊操作需獲取鎖,操作完成后釋放鎖。
  • 性能分析
    • 在高并發下,鎖競爭激烈。線程會頻繁阻塞和喚醒,導致大量上下文切換開銷。
    • 吞吐量低:隨著線程數增加,性能急劇下降。例如,在 100 個線程并發時,吞吐量可能降到單線程的 1/10。
    • 延遲高:操作平均耗時長,因為線程需等待鎖。
    • 適用場景:低并發或簡單同步任務,但不適合高并發點贊。
  • 示例代碼(模擬點贊計數器)
    public class LikeCounter {private long count = 0;public synchronized void increment() {count++; // 點贊操作}public long getCount() {return count;}
    }
    

2. AtomicLong

  • 原理:基于 CAS(Compare-And-Swap)操作實現原子性,無需鎖。通過硬件指令優化。
  • 性能分析
    • 比 synchronized 更好:CAS 避免了阻塞,減少了上下文切換。
    • 但在高并發下,CAS 失敗率高:多個線程競爭同一變量時,需重試多次,導致 CPU 空轉和緩存一致性開銷。
    • 吞吐量中等:在低到中并發下表現良好,但線程數超過 CPU 核心數時,性能下降明顯。例如,在 50 個線程時,吞吐量可能比 LongAdder 低 30-50%。
    • 延遲較低:但高競爭時仍不穩定。
    • 適用場景:中低并發計數器,簡單原子操作。
  • 示例代碼
    import java.util.concurrent.atomic.AtomicLong;public class LikeCounter {private AtomicLong count = new AtomicLong(0);public void increment() {count.incrementAndGet(); // 原子點贊操作}public long getCount() {return count.get();}
    }
    

3. LongAdder

  • 原理:Java 8 引入,使用分段(cell)機制減少競爭。每個線程操作獨立的局部變量,最后通過 sum() 合并結果。
  • 性能分析
    • 高并發下最優:通過分散熱點,顯著降低競爭。CAS 失敗率低,CPU 利用率高。
    • 吞吐量高:線程數增加時,性能可線性擴展。例如,在 100 個線程下,吞吐量可達 AtomicLong 的 2-5 倍。
    • 延遲低:操作平均耗時短,適合高頻更新。
    • 缺點:sum() 方法有合并開銷,但點贊場景通常讀少寫多,影響小。
    • 適用場景:高并發計數器如點贊、實時統計。
  • 示例代碼
    import java.util.concurrent.atomic.LongAdder;public class LikeCounter {private LongAdder count = new LongAdder();public void increment() {count.increment(); // 高效點贊操作}public long getCount() {return count.sum();}
    }
    

4. LongAccumulator

  • 原理:Java 8 引入,類似 LongAdder,但支持自定義累加函數(如加法、最大值)。內部也使用分段機制。
  • 性能分析
    • 與 LongAdder 相當:在簡單加法操作(如點贊的 increment)上,性能幾乎相同。分段機制減少競爭。
    • 吞吐量高:可擴展性好,線程數增加時性能穩定。
    • 優勢:更靈活,支持復雜操作(如累加器函數),但點贊場景只需簡單加 1,因此無額外優勢。
    • 延遲低:類似 LongAdder。
    • 適用場景:高并發且需自定義累加邏輯的任務,但點贊場景中性能與 LongAdder 持平。
  • 示例代碼
    import java.util.concurrent.atomic.LongAccumulator;
    import java.util.function.LongBinaryOperator;public class LikeCounter {private LongAccumulator count;public LikeCounter() {LongBinaryOperator accumulator = (x, y) -> x + y; // 自定義加法函數count = new LongAccumulator(accumulator, 0);}public void increment() {count.accumulate(1); // 點贊操作}public long getCount() {return count.get();}
    }
    

性能排名分析

在高并發點贊場景(如 100+ 線程同時操作),性能從高到低排名如下:

  1. LongAdder 和 LongAccumulator(并列最佳)
    • 理由:分段機制最小化競爭,吞吐量最高(可達百萬級操作/秒),延遲最低。在高線程數下可擴展性最好。
  2. AtomicLong
    • 理由:CAS 優于鎖,但高競爭時重試開銷導致吞吐量下降,性能次于分段類。
  3. synchronized
    • 理由:鎖競爭嚴重,吞吐量最低(可能低于 10% 的分段類),延遲最高,不適合高并發。
關鍵性能指標比較(基于基準測試數據)
吞吐量(高并發下)延遲(平均操作耗時)可擴展性(線程增加時)
LongAdder非常高很低優秀
LongAccumulator非常高很低優秀
AtomicLong中等中等一般
synchronized
  • 高并發熱點問題:點贊場景是“寫密集型”,變量頻繁更新。synchronized 和 AtomicLong 在單一變量上競爭激烈,而 LongAdder/LongAccumulator 通過分段分散競爭,減少緩存行沖突(false sharing)。
  • 實際測試數據:在 JMH 基準測試中,線程數 > 32 時,LongAdder 的吞吐量通常比 AtomicLong 高 3-10 倍,比 synchronized 高 10-50 倍。LongAccumulator 在加法操作上與 LongAdder 性能一致。
  • 推薦:對于高并發點贊的功能,優先選擇 LongAdder(簡單計數)或 LongAccumulator(如果需要靈活性)。避免 synchronized 和 AtomicLong 在高競爭下使用。

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

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

相關文章

postgreSQL的sql語句

目錄 一:前提準備1.postgreSQL的安裝可以參考我下面一片文章: 二:SQL語句 1.相同點:支持標準sql類型 2.參考詳細學習地址: 3.postgresql與mysql的不同點 一:前提準備 1.postgreSQL的安裝可以參考我下面…

vue3 JavaScript 數據累加 reduce

在Vue 3中,你可以使用JavaScript的reduce方法來處理數據累加。reduce方法通常用在數組上,它將數組中的每個元素通過一個累加器函數(accumulator)從左到右累積,最終生成一個單一的值。這在計算總和、累加值等場景中非常…

史上最清楚!讀者,寫者問題(操作系統os)

讀者-寫者問題是另一個里程碑式的同步互斥問題。它比生產者-消費者更復雜,因為它引入了不對稱的訪問權限:讀者和讀者之間是共享的,但寫者和任何人(包括讀者和其他寫者)之間都是互斥的。我們用一個生動的比喻來解析這個…

使用Starrocks替換Clickhouse的理由

背景 Starrocks和clickhouse都是非常優秀的OLAP數據庫,那么什么情況下使用clickhouse,什么場景下使用starrocks呢,本文就簡單列舉一下他們的優缺點 理由 首先兩者都是列存儲,并且都實現了列壓縮,所以從存儲中兩者的壓縮…

Mybatis 兩級緩存可能導致的問題

Mybatis 兩級緩存可能導致的問題兩級緩存簡介一級緩存 localCache效果開關二級緩存兩級緩存可能導致的問題分布式環境下查詢到過期數據事務隔離級別失效讀已提交失效讀未提交失效總結兩級緩存簡介 一級緩存 localCache 效果 一級緩存是 session 或者說事務級別的&#xff0c…

vue3+uniapp 使用vue-plugin-hiprint中實現打印效果

前言: vue3uniapp 使用vue-plugin-hiprint中實現打印效果 官網地址:gitee https://gitee.com/ccsimple/vue-plugin-hiprinthttps://gitee.com/ccsimple/vue-plugin-hiprint 實現效果: 預覽打印內容: 實現步驟: 1、安…

【elementUI踩坑記錄】解決 el-table 固定列 el-table__fixed 導致部分滾動條無法拖動的問題

目錄一、問題背景二、 問題現象三、核心原因四、解決辦法增強方案🚀寫在最后一、問題背景 在使用 Element UI 的 el-table 組件時,固定列功能雖然實用,但會引發滾動條交互問題: 固定列區域懸浮顯示滾動條但無法正常拖動滾動條 …

【機器人編程基礎】python文件的打開和關閉

文件的打開和關閉 在Python中,文件操作是一項基本而重要的任務,涉及到打開、讀取、寫入、關閉文件等操作。正確地管理文件對于數據持久化、輸入輸出處理等至關重要。下面將詳細解釋如何在Python中打開和關閉文件,并提供相應的代碼示例。 文件打開 在Python中,可以使用內…

ShenYu實戰、問題記錄

概述 一款高性能的國產的Apache開源API網關,官方文檔。 在ShenYu v2.6.1, ShenYu注冊中心只支持http類型,中間件注冊類型已經被移除。 所以,請使用http注冊類型來注冊你的服務。不是微服務注冊中心,它只是將元數據、選擇器數據、…

走近科學IT版:EasyTire設置了ip,但是一閃之后就變回到原來的dhcp獲得的地址

EasyTier 是一款簡單、安全、去中心化的內網穿透和異地組網工具,適合遠程辦公、異地訪問、游戲加速等多種場景。無需公網 IP,無需復雜配置,輕松實現不同地點設備間的安全互聯。 上次實踐的記錄:適合遠程辦公、異地訪問的EasyTier…

rk3588平臺USB 3.0 -OAK深度相機適配方法

目錄 文件更改記錄表 1、usb規則添加 2、拉取相關依賴 3、安裝python3、安裝pip 4、安裝依賴 5、安裝ffmeg 6、攝像頭功能測試 7、將視頻拷貝到U盤查看 1、usb規則添加 由于OAK是USB設備,因此為了在使用 udev 工具的系統上與之通信, 您需要添加udev規則以使…

工廠模式總結

工廠模式1. 簡單工廠模式&#xff08;Simple Factory&#xff09; 核心思想 定義一個工廠類&#xff0c;根據輸入參數創建不同的具體對象。客戶端不直接調用具體類的構造函數&#xff0c;而是通過工廠類獲取對象。 示例代碼 #include <iostream> #include <memory>…

MySQL的三種安裝方式(mis、zip、yum)

目錄 2.0數據庫安裝 2.1windows上.mis格式 環境準備 MySQL的安裝 環境配置&#xff08;非必要&#xff09; 2.2windows上.zip格式安裝 環境準備 配置文件的內容 MySQL的安裝 附錄可能出現問題 圖形工具遠程連接數據庫 2.3Linux上安裝yum包 環境準備 過程命令 My…

串口學習和藍牙通信HC05(第八天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4b…

設計總監的“輕量化”新武器:用Adobe Express,音頻一鍵驅動動畫

在快節奏的創意項目中&#xff0c;如何將復雜的設計理念或冗長的研究報告&#xff0c;快速轉化為易于理解、富有吸引力的動態內容&#xff0c;是衡量一個團隊溝通效率的關鍵。作為一名在海外設計界工作了十余年的設計師&#xff0c;我發現&#xff0c;最高效的團隊&#xff0c;…

零知開源——STM32F407VET6驅動SHT41溫濕度傳感器完整教程

?零知開源是一個真正屬于國人自己的開源軟硬件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&…

Linux流量分析:tcpdump wireshark

前言 最近因為工作需要&#xff0c;研究了下如何使用tcpdump和wireshark分析業務流量。如果要使用tcpdump分析具體的HTTP請求耗時&#xff0c;需捕獲網絡數據包并分析時間戳信息&#xff0c;重點關注TCP連接的建立、HTTP請求發送到響應接收的全過程。 以下是具體步驟和技巧&…

深度學習圖像分類數據集—角膜潰瘍識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;角膜潰瘍識別分類&#xff1a;[dot, mix, slice] 訓練數據集總共有270張…

功能強、超好用【PDF轉換工具】的介紹下載與安裝教程

Windows 電腦上一款簡單好用的PDF轉換工具&#xff0c;可以輕松地將其他文檔轉換為 PDF 格式&#xff0c;也可以將 PDF 文件轉換為其他格式&#xff0c;如常見的 Word、Excel、PPT 等。 此外軟件還支持 Office 文檔合并分割、旋轉頁面、拼接頁面、刪除文字、刪除頁面、添加水印…

c# 釘釘應用實現監聽審批事件以及獲取審批結果的流程

oa的操作已經測試了一遍 image.png如果是自建oa則代表發起的審批是跳轉網頁&#xff0c;否則釘釘打開后是一個表單界面&#xff0c;不需要調整自己搞得oa。 所以我感覺目前公司的需求更適合官方oa 表單來填寫,更靈活&#xff0c;還支持用戶配置。 但是用戶點了審批&#xff0c;…