內存可見性和偽共享問題

文章目錄

  • 什么是內存可見性問題
  • 為什么會出現可見性問題
  • 解決可見性問題的方法
    • 1. 使用volatile關鍵字
    • 2. 使用synchronized
    • 3. 使用java.util.concurrent包下的原子類
  • 什么是偽共享問題
  • CPU緩存行
  • 偽共享的危害
  • 解決偽共享的方法
    • 1. 緩存行填充
    • 2. 使用@Contended注解(JDK 8+)

什么是內存可見性問題

內存可見性問題指的是:一個線程對共享變量的修改,對其他線程不一定立即可見。這聽起來很奇怪,但在現代多核處理器架構下,確實存在這個問題。

為什么會出現可見性問題

現代CPU為了提升性能,每個核心都有自己的緩存,多個核心共享L3緩存。當線程修改變量時,可能只是修改了CPU緩存中的副本,而沒有立即寫回主內存。

public class VisibilityExample {private boolean flag = false;private int counter = 0;public void writer() {counter = 1;        // 寫操作1flag = true;        // 寫操作2}public void reader() {if (flag) {         // 讀操作1System.out.println(counter);  // 讀操作2}}
}

在上面的例子中,即使flag為true,counter的值對讀線程可能仍然不可見。

解決可見性問題的方法

1. 使用volatile關鍵字

public class VolatileExample {private volatile boolean flag = false;private volatile int counter = 0;// volatile確保修改立即對其他線程可見
}

2. 使用synchronized

public class SynchronizedExample {private boolean flag = false;private int counter = 0;public synchronized void writer() {counter = 1;flag = true;}public synchronized void reader() {if (flag) {System.out.println(counter);}}
}

3. 使用java.util.concurrent包下的原子類

public class AtomicExample {private final AtomicBoolean flag = new AtomicBoolean(false);private final AtomicInteger counter = new AtomicInteger(0);public void writer() {counter.set(1);flag.set(true);}public void reader() {if (flag.get()) {System.out.println(counter.get());}}
}

什么是偽共享問題

偽共享是指多個線程訪問同一緩存行中的不同變量時,即使這些變量在邏輯上是獨立的,但由于它們位于同一緩存行,一個線程的修改會導致其他線程的緩存行失效,從而引起不必要的緩存同步開銷。

CPU緩存行

現代CPU的緩存是以緩存行為單位進行管理的,一般大小為64字節,相當于8個long類型的數據。當CPU訪問內存時,會將包含目標地址的整個緩存行加載到緩存中。

偽共享的危害

public class FalseSharingExample {// 這兩個變量很可能在同一緩存行中private volatile long variableA = 0L;private volatile long variableB = 0L;public void threadA() {for (int i = 0; i < 100000000; i++) {variableA++;  // 線程A修改variableA}}public void threadB() {for (int i = 0; i < 100000000; i++) {variableB++;  // 線程B修改variableB}}
}

在上面的例子中,雖然兩個線程操作不同的變量,但由于變量可能在同一緩存行,每次修改都會導致對方的緩存行失效,導致線程讀取變量的時候又要去內存中讀取,性能大幅下降。

解決偽共享的方法

1. 緩存行填充

public class PaddingExample {private volatile long variableA = 0L;// 使用填充字節避免偽共享private long p1, p2, p3, p4, p5, p6, p7;private volatile long variableB = 0L;private long p8, p9, p10, p11, p12, p13, p14;
}

2. 使用@Contended注解(JDK 8+)

@sun.misc.Contended
public class ContendedExample {private volatile long variableA = 0L;@sun.misc.Contendedprivate volatile long variableB = 0L;
}

使用@Contended需要JVM參數:-XX:-RestrictContended

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

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

相關文章

Spring MVC 九大組件源碼深度剖析(三):ThemeResolver - 動態換膚的奧秘

文章目錄一、主題機制的核心價值二、核心接口設計三、四大實現類源碼解析1. FixedThemeResolver&#xff08;固定主題策略&#xff09;2. CookieThemeResolver&#xff08;Cookie存儲策略&#xff09;3. SessionThemeResolver&#xff08;Session存儲策略&#xff09;4. Abstra…

一、Docker本地安裝

((這里引用知乎上大佬的說法&#xff1a;https://www.zhihu.com/question/48174633 服務器虛擬化解決的核心問題是資源調配&#xff0c;而容器解決的核心問題是應用開發、測試和部署。 一、參考帖子 Ubuntu 的 |Docker 文檔 【docker】ubuntu完全卸載docker及再次安裝_ubuntu…

LeetCode 分類刷題:2962. 統計最大元素出現至少 K 次的子數組

題目給你一個整數數組 nums 和一個 正整數 k 。請你統計有多少滿足 「 nums 中的 最大 元素」至少出現 k 次的子數組&#xff0c;并返回滿足這一條件的子數組的數目。子數組是數組中的一個連續元素序列。示例 1&#xff1a;輸入&#xff1a;nums [1,3,2,3,3], k 2 輸出&#…

10分鐘掌握swift

整理一個 10分鐘掌握 Swift 的精華指南&#xff0c;用一個 Demo 串聯 Swift 的核心語法、數據結構、函數、類/結構體和閉包&#xff0c;讓你快速入門。1?? 基礎語法與變量import Foundation // 引入基礎庫// 變量和常量 var name: String "Alice" // 可變 let…

【完整源碼+數據集+部署教程】食品分類與實例分割系統源碼和數據集:改進yolo11-AggregatedAttention

背景意義 研究背景與意義 隨著全球食品產業的快速發展&#xff0c;食品安全和質量控制日益成為社會關注的焦點。食品分類與實例分割技術的應用&#xff0c;能夠有效提升食品識別的準確性和效率&#xff0c;為食品監管、營養分析以及智能餐飲等領域提供重要支持。傳統的食品識別…

C# 中的N+1問題

目錄 含義 影響 避免方法 1. 立即加載&#xff08;Eager Loading&#xff09; 2. 顯式加載&#xff08;Explicit Loading&#xff09; 3. 投影&#xff08;Projection&#xff09; 4. 批處理查詢 5. 禁用延遲加載 含義 N1 問題 是 ORM&#xff08;對象關系映射&#x…

國內多光譜相機做得好的廠家有哪些?-多光譜相機品牌廠家

多光譜相機是一種能夠同時捕捉多個特定波段的光譜信息&#xff0c;這些波段覆蓋可見光、近紅外以及短波紅外等區域。廣泛應用于遙感、農業、環境監測、工業檢測、安防等領域。近年來&#xff0c;我國在多光譜技術領域取得了顯著進步&#xff0c;涌現出一批技術實力強、產品性能…

如何用外部電腦訪問本地網頁?

之前本來說用內網穿透工具來查看完成這個工具&#xff0c;結果感覺各種不符合心意&#xff0c;突然發現有更簡單的方法。如果想讓兩臺電腦在 同一局域網 內都能訪問運行在 http://localhost:5174/ 上的項目&#xff0c;而不需要使用內網穿透工具&#xff0c;可以通過以下方法實…

PromptPilot — AI 自動化任務的下一個環節

作者:陳大魚頭 github:https://github.com/KRISACHAN 郵箱:chenjinwen77@gmail.com PromptPilot 體驗地址:https://promptpilot.volcengine.com/ 前言 如果大家有關注 AI 相關新聞的話,一定會知道在 2025 年 6 月 11 日火山引擎 FORCE 原動力大會上,豆包大模型 1.6 系列…

[Responsive theme color] 動態更新 | CSS變量+JS操控 | 移動端-漢堡菜單 | 實現平滑滾動

第3章&#xff1a;CSS變量操控 歡迎回來&#x1f43b;??? 通過前兩章&#xff0c;我們掌握了 動態主題定制 的交互邏輯&#xff0c;以及 色彩工具函數 如何實現色值格式轉換。 本章將揭示技術拼圖的最后一塊&#xff1a;CSS變量動態操控&#xff0c;解析JavaScript如何實…

數學建模 15 邏輯回歸與隨機森林

邏輯回歸&#xff08;用于分類&#xff09;用途&#xff1a;通過已有數據&#xff0c;計算出線性方程的參數w后&#xff0c;可以用于預測某一個物品屬于某一類的概率&#xff0c;[0,1];求解思想&#xff1a;邏輯回歸通過最大似然估計&#xff08;Maximum Likelihood Estimation…

衡石使用指南嵌入式場景實踐之儀表盤嵌入

應用展示交互 應用集市展示應用時會與儀表盤、圖表進行交互操作&#xff0c;主要包括去分析、保存當前過濾快照、字段設置、刷新、全屏、嵌入、導出等功能。 保存當前過濾快照 儀表盤展示數據時往往使用過濾器來查看不同場景下的分析數據。用戶從一種場景切換到另一種場景&a…

Qt | 四種方式實現多線程導出數據功能

前言 在以往的項目開發中&#xff0c;在很多地方用到了多線程。針對不同的業務邏輯&#xff0c;需要使用不同的多線程實現方法&#xff0c;來達到優化項目的目的。本文記錄下在Qt開發中用到的多線程技術實現方法&#xff0c;以導出指定范圍的數字到txt文件為例&#xff0c;展示…

運放的學習筆記以及一些用法的個人看法

負反饋形成了虛短。 你的輸出會對-極產生一個向上的電壓&#xff0c;當你的-的時候就兩邊相等了&#xff0c;這個時候就輸出就不變了&#xff0c;也就是負反饋調節&#xff0c;調節了左邊的電壓差 如果你的右邊輸出已經達到了12v或者0v這個時候你就飽和了&#xff0c;這個時候…

MySQL的三大范式:

目錄 鍵和相關屬性的概念&#xff1a; 第一范式&#xff1a; 第二范式&#xff1a; 第三范式&#xff1a; 總結&#xff1a; 反范式化&#xff1a; 在關系型數據庫中&#xff0c;關于數據表設計的基本原則&#xff0c;規則就稱為范式。 范式是關系數據庫理論的基礎&…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘imageio’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘imageio’問題 摘要 在Python開發過程中&#xff0c;尤其是使用PyCharm等IDE時&#xff0c;遇到pip install報錯是一個常見的問題&#xff0c;尤其是在執行安裝…

2025年高效能工程項目管理軟件推薦榜單:AI重構工程進度可視化與資源動態調度體系

在工程行業數字化深度變革的2025年,項目管理正面臨前所未有的挑戰與機遇。權威數據顯示,68%的工程項目因進度追蹤滯后導致交付延期,超半數企業因數據孤島陷入跨部門協同效率低下的困境,而資源錯配造成的隱性成本損失高達年度預算的15%。隨著AI決策引擎、BIM全流程融合、IoT物聯…

豆包 Java的23種設計模式

Java的23種設計模式是軟件開發中常用的設計思想總結&#xff0c;根據用途可分為三大類&#xff1a;創建型、結構型和行為型。 一、創建型模式&#xff08;5種&#xff09; 用于處理對象創建機制&#xff0c;隱藏創建邏輯&#xff0c;使程序更靈活。 單例模式&#xff1a;保證一…

Redis7學習--詳解哨兵,文件配置、主客觀下線

目錄 一、前言 二、哨兵 1、是什么&#xff1f; 2、哨兵的功能 3、案例演示 Redis Sentinel 架構 配置說明 哨兵配置文件 主從配置文件 主節點宕機后各節點狀態 主從切換后配置文件的自動調整 4、哨兵運行流程和選舉原理 SDOWN主觀下線 ODOWN客觀下線 選出新的主節…

Android 項目:畫圖白板APP開發(二)——歷史點、數學方式推導點

上一章我們講解了如何繪制順滑、優美的曲線&#xff0c;為本項目的繪圖功能打下了基礎。本章我們將深入探討兩個關鍵功能的實現&#xff1a;歷史點和數學方式推導點。這些功能將大幅提升我們白板應用的專業性和用戶體驗。一、History點之前在onTouchEvent中獲取的MotionEvent&a…