国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳析Java線程進程的并發問題

如意 ? 來源:IT技術百貨 ? 作者:IT技術百貨 ? 2020-07-07 11:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

并發的前提條件

并發問題發生的前提條件一定是資源共享,這里的資源一般指的是數據,共享指的是多線程之間共享。

也就是只有在多線程共享資源的情況下才可能產生并發問題,這是并發問題產生的前提條件,在這個條件下,有可能產生并發問題,那么并發問題的根源究竟是什么呢?

CPU操作數據的基本機制

前面提到了并發的前提條件是數據共享,想了解并發問題的根源就需要知道CPU操作數據的基本原理;

數據存儲包括這幾個位置:磁盤、內存、緩存、寄存器

寄存器可以認為是CPU的一部分,所以有的地方并沒有將CPU和寄存器拆分講解,通常來講只需要知道CPU運算時都是從寄存器取數據,運算完成后再放回寄存器即可,CPU和寄存器之間沒有其他任何中介。

緩存是CPU與寄存器之外的一層存儲,但也是每一個CPU獨立占有的一塊內存區域,各個CPU緩存之間數據不可以共享。

內存是程序運行時數據的主要存放區域,內存數據是共享的,一般來講,各個CPU都可以訪問內存中的數據;

磁盤,數據最終持久化的存儲;

CPU操作數據的流程一般是先由磁盤讀到內存,再從內存讀到緩存,再由緩存到寄存器進行運算;運算之后的結果直接寫入寄存器,然后刷新到緩存,再刷新到內存,最后寫入磁盤;

程序數據流圖

并發問題的源頭

了解了CPU運行機制之后,下面說并發問題的根源,主要是由于數據可見性、操作原子性、操作有序性這三個原因導致的;

什么是數據可見性?

通俗點來說就是CPU看到的數據并不是最新的數據,CPU讀取數據是優先從緩存中讀取,如果緩存中存在就使用緩存中的數據,假如數據被另一個CPU改變了,這時其他CPU中緩存數據就可能與內存中的數據不一致,也就是CPU沒有看到并使用最新的數據,導致程序執行結果異常。

什么是操作原子性?

同一個CPU可以交替執行多個線程,不太了解的讀者可以初步學習一下CPU時間片與線程調度的基本知識。

在同一個CPU,交替執行多個線程的時候,就可能出現線程中斷,并且在中斷過程中受其他線程影響而導致中斷的線程恢復之后,執行邏輯異常。

比如:a線程執行count = count + 1操作,b線程也執行相同的操作;當a線程讀取到count的值,并進行加1計算之后,還沒寫回到內存之前被中斷,b線程完全執行了count = count + 1,count的值得到更新;這時a線程恢復(并不會重新讀取并計算),將之前計算的值寫回到緩存,導致count本來應該執行兩次加1,但最終結果只加了一次1;

什么是操作有序性?

有序性指的是CPU執行代碼的順序和程序開發者定義的順序不一致?為什么還會不一致呢?

編譯器在將高級開發語言編譯成計算機指令的時候,出于性能優化,可能會對代碼執行重排序,CPU在執行指令的時候,也可能對代碼重排序;當然重排序的前提是在單線程條件下的語義不變性,但不能保證多線程條件下語義也相同。

Java單例模式中的雙重校驗鎖,單例變量為什么要聲明為volatile,就是為了解決指令重排序帶來的問題,我們在下一章節進行詳細講解。感興趣的也可以自行查閱資料學習。

并發問題的解決方案

并發問題不是Java語言特有的,而是計算機運行原理與操作系統帶來的,那么從計算機與操作系統層面來看,它們都提供了哪些解決方案來避免數據可見性、程序原子性、操作有序性的保障呢?Java語言又是如何對這些方案進行封裝的呢?開發者有哪些手段可以解決這些問題呢?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116434
  • 線程
    +關注

    關注

    0

    文章

    509

    瀏覽量

    20826
  • 進程
    +關注

    關注

    0

    文章

    211

    瀏覽量

    14536
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    飛凌嵌入式ElfBoard-進程之什么是進程

    ID,簡稱 PID),用來標識當前的進程,區分不同的進程。這使得系統能夠有效地管理多個并發運行的進程,避免混淆。在Linux命令行中直接使用ps命令即可查看到
    發表于 03-02 08:49

    LTC1645雙路熱插拔控制器:功能、應用與設計要點

    LTC1645雙路熱插拔控制器:功能、應用與設計要點 引言 在電子電路設計中,熱插拔功能對于確保系統的穩定性和可維護性至關重要。Linear Technology公司的LTC1645雙路熱插拔
    的頭像 發表于 02-11 10:15 ?150次閱讀

    進程概念和特征

    進程的概念   在多道程序環境下,允許多個程序并發執行,此時它們將失去封閉性,并具有間斷性及不可再現性的特征。為此引入了進程(Process)的概念,以便更好地描述和控制程序的并發執行
    發表于 01-15 06:39

    進程通信

    空間一般都是獨立的,要想讓兩個用戶進程共享空間必須通過特殊的系統調用實現,而進程內的線程是自然共享進程空間的。   消息傳遞   在消息傳遞系統中,
    發表于 01-15 06:16

    【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實時操作系統)《線程》個人理解及項目實現

    System,實時操作系統)線程含義 在 RTOS(Real-Time Operating System,實時操作系統) 中,線程(Thread) 是任務調度和并發執行的基本單位。不同 RTOS 對
    發表于 01-14 11:50

    深入Linux內核:進程調度的核心邏輯與實現細節

    在Linux系統中,進程調度就像一位精明的“CPU管理員”——它決定著哪個進程能優先使用CPU,多久切換一次進程,如何平衡系統響應速度與資源利用率。小到桌面應用的流暢點擊,大到服務器的多任務
    的頭像 發表于 12-24 07:05 ?4307次閱讀
    深入Linux內核:<b class='flag-5'>進程</b>調度的核心邏輯與實現細節

    解析Linux的進程線程和協程

    )用戶態線程:協程不依賴于操作系統的線程管理,由程序員手動控制。 (2)輕量級:協程切換的開銷非常小,適用于高并發的場景。 (3)高度可控性:程序員可以精確控制協程的執行流程。 二、進程
    發表于 12-22 11:00

    Linux多線程對比單線程的優勢

    。「提高響應性」:線程可以使程序更加響應用戶輸入或其他事件,避免阻塞。線程相比單線程的優點:「并發性」:多線程可以同時執行多個任務,而單
    發表于 12-01 06:11

    飛凌嵌入式ElfBoard-文件I/O的了解探究之競爭冒險

    競爭冒險(Race Condition)指的是在多線程或多進程環境中,多個線程進程對共享資源進行訪問和修改時可能導致的不確定性結果或錯誤行為。競爭冒險通常發生在多個
    發表于 11-26 15:38

    【HZ-T536開發板免費體驗】—— linux創建線程

    線程進程 一個進程指的是一個正在執行的應用程序,而線程的功能是執行應用程序中的某個具體任務。線程具有傳統
    發表于 09-01 21:31

    Task任務:LuatOS實現“任務級并發”的核心引擎

    Task任務通過其強大的并發處理能力,使LuatOS能夠在單線程環境中模擬多線程執行,通過協程的掛起與恢復機制,實現任務級的并行操作,顯著提升系統效能。 sys核心庫是LuatOS運行框架庫,也是
    的頭像 發表于 08-28 13:49 ?514次閱讀
    Task任務:LuatOS實現“任務級<b class='flag-5'>并發</b>”的核心引擎

    什么是ArkTS?

    基礎類庫能力示意圖 提供異步并發和多線程并發的能力。 支持Promise和async/await等標準的JS異步并發能力。 TaskPool為應用程序提供一個多
    發表于 06-17 06:24

    鴻蒙5開發寶藏案例分享---應用并發設計

    ?** 鴻蒙并發編程實戰指南:解鎖ArkTS多線程黑科技** 嘿,開發者朋友們! 今天給大家扒一扒鴻蒙官方文檔里藏著的并發編程寶藏—— 100+實戰場景解決方案 !從金融理財到游戲開發,從折疊屏適配
    發表于 06-12 16:19

    進程線程、協程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    是(每個進程可以跑在不同CPU) 是(線程可以分配到不同核) 否(只能在一個核上蹦迪) 適用場景 銀行系統、docker容器 視頻渲染、實時音視頻 微信客服、高并發Web服務器 社死案例
    發表于 03-26 09:27

    請問如何在Python中實現多線程與多進程的協作?

    大家好!我最近在開發一個Python項目時,需要同時處理多個任務,且每個任務需要不同的計算資源。我想通過多線程和多進程的組合來實現并發,但遇到了一些問題。 具體來說,我有兩個任務,一個是I/O密集型
    發表于 03-11 06:57