【Java併發入門】01 併發編程Bug的源頭

来源:https://www.cnblogs.com/shuofxz/archive/2022/11/28/16933067.html
-Advertisement-
Play Games

併發編程Bug的源頭:可見性、原子性和有序性問題。 「CPU、記憶體、磁碟之間的速度差異」 - 為了能同時執行多個任務,CPU 發展出時間片輪轉、多核等 - CPU 要從記憶體中讀數據太慢了,所以給自己設置了緩存 - CPU 讀磁碟更慢了,所以可以讓該線程阻塞 ...


一、根本原因

「CPU、記憶體、磁碟之間的速度差異」

  • 為了能同時執行多個任務,CPU 發展出時間片輪轉、多核等
  • CPU 要從記憶體中讀數據太慢了,所以給自己設置了緩存
  • CPU 讀磁碟更慢了,所以可以讓該線程阻塞

二、直接原因

緩存導致的可見性問題

CPU 把要處理的數據載入到自己的緩存中,處理完了放回自己的緩存。

另一個 CPU 同樣的處理,就導致可能看不到上一個 CPU 處理的結果。

線程切換帶來的原子性問題

程式中的一行代碼往往不是一條 CPU 指令。

線程切換的時候,可能會在一個代碼執行的中間地方切換。

編譯優化帶來的有序性問題

優化會為了更高效的利用 CPU 緩存,將代碼指令重排。

這個重排的過程會導致看似沒問題的代碼,多線程出現邏輯問題。

三、為啥要遇到這些問題

  • 為了提高程式的性能
  • 引入了新方法,就要處理這個方法對應的問題
  • 可以說是硬體工程師和操作系統工程師為了提高執行效率,給軟體工程師帶來的麻煩

接下來的幾篇文章會介紹如何解決上面提到的「可見性、原子性、有序性」的問題。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 面向對象是非常重要的! # 抽象,是個思想,結構 # 小明 小紅 小雨 都是人 # 海爾洗衣機 海東洗衣機 海西洗衣機 都是洗衣機 # 貓 狗 熊貓 都是動物 # 藍圖 # # class WashingMachine: # 類名一般是大駝峰 # pass # # 特征是屬性 # age = 2 ...
  • 多線程實現socket通信伺服器端代碼 import socket import threading class MyServer(object): def __init__(self): # 初始化socket self.server = socket.socket(socket.AF_INET, ...
  • Filter過濾器 1.Filter過濾器說明 為什麼需要過濾器? 先來看一個例子: 我們在登錄網站頁面時,需要先進行登錄驗證。 用戶訪問的正常的流程應該是: 用戶先通過登錄頁面進行驗證,然後才可以訪問各種頁面。 為了防止用戶繞過登錄驗證,我們需要在每個頁面進行驗證, 獲取session,驗證用戶是 ...
  • 一.小結 1.類是對象的模板。它定義對象的屬性,並提供創建對象的構造方法以及對對象進行操作的方法。 2.類也是一種數據類型。可以用它聲明對象引用變數。對象引用變數中似乎存放了一個對象,但事實上,它包含的只是對該對象的引用。嚴格地講,對象引用變數和對象是不同的,但是大多數情況下,它們的區別是可以忽略的 ...
  • 版權聲明:原創不易,本文禁止抄襲、轉載,侵權必究! 一、pywifi簡介&安裝 開發環境:Windows10 Python3.6.4 第三方庫:pywifi-1.1.12 IDE :PyCharm/Sublime Text pywifi簡介: pywifi是python中一個用於操作無線介面的第三方 ...
  • 巨集在 C 語言中非常重要,但在 C++ 中卻無甚大用,普遍的共識:儘量避免使用巨集 C++ 之父 Bjarne 在《C++ Programming Language》中寫到 Avoid macros 《Effective C++》 條款 2 Prefer const, enum, and inline ...
  • 目錄 一.OpenGL 圖像色階 1.原始圖片 2.效果演示 二.OpenGL 圖像色階源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> ...
  • 目標:爬取xx二手房樓市信息自己分析形勢 目的:記錄重溫爬蟲歷程 1、引用包requests,random,time,pandas,bs4 2、查詢:bs4使用方法,re。comple,以及他山之石。 3、思路:簡單應用,直接寫死不用def,class, -url 列表,初始列表後,append添加 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...