在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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
    +關注

    關注

    19

    文章

    2970

    瀏覽量

    104800
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19697
  • 進程
    +關注

    關注

    0

    文章

    203

    瀏覽量

    13962
收藏 人收藏

    評論

    相關推薦

    socket 多線程編程實現方法

    是指在同一個進程中運行多個線程,每個線程可以獨立執行任務。線程共享進程的資源,如內存空間和文件句柄,但每個
    的頭像 發表于 11-12 14:16 ?377次閱讀

    一文搞懂Linux進程的睡眠和喚醒

    機制 1)信號(Signal): 進程可以通過接受特定信號被喚醒。 2)條件變量(Condition Variable): 多線程編程中用于同步多個線程的工具,可以讓一個線程在某些
    發表于 11-04 15:15

    Python中多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多
    的頭像 發表于 10-23 11:48 ?410次閱讀
    Python中多<b class='flag-5'>線程</b>和多<b class='flag-5'>進程</b>的區別

    探索虛擬線程:原理與實現

    虛擬線程的引入與優勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現的,這些線程被稱為
    的頭像 發表于 06-24 11:35 ?315次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現

    一句話讓你理解線程進程

    今天給大家分享一下線程進程,主要包含以下幾部分內容:一句話說明線程進程操作系統為什么需要進程為什么要引入
    的頭像 發表于 06-04 08:04 ?1222次閱讀
    一句話讓你理解<b class='flag-5'>線程</b>和<b class='flag-5'>進程</b>

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    的一系列復雜偶發的問題,同時并發度也相對較高,因此得到了廣泛的支持和使用,也是當前ArkTS語言選擇的并發模型。 由于Actor模型的內存隔離特性,所以需要進行跨線程的數據序列化傳輸。 一、數據傳輸
    發表于 03-28 14:35

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    的一系列復雜偶發的問題,同時并發度也相對較高,因此得到了廣泛的支持和使用,也是當前ArkTS語言選擇的并發模型。 由于Actor模型的內存隔離特性,所以需要進行跨線程的數據序列化傳輸。 一、數據傳輸
    發表于 03-22 15:40

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執行不同的任務或操作。
    的頭像 發表于 03-14 16:55 ?718次閱讀

    python中5種線程鎖盤點

    線程安全是多線程或多進程編程中的一個概念,在擁有共享數據的多條線程并行執行的程序中,線程安全的代碼會通過同步機制保證各個
    發表于 03-07 11:08 ?1599次閱讀
    python中5種<b class='flag-5'>線程</b>鎖盤點

    基于RTOS的應用進程中的典型線程

    RTOS中的關鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應速度或可預測性,而不是它在給定時間段內可以執行的工作量。
    發表于 03-05 09:32 ?634次閱讀
    基于RTOS的應用<b class='flag-5'>進程</b>中的典型<b class='flag-5'>線程</b>

    嵌入式系統中的線程進程與任務概念與區別

    每個線程與主程序共用地址空間,受限于2GB地址空間; 2)線程之間的同步和加鎖控制比較麻煩;一個線程的崩潰可能影響到整個程序的穩定性
    發表于 03-04 15:03 ?1376次閱讀
    嵌入式系統中的<b class='flag-5'>線程</b>、<b class='flag-5'>進程</b>與任務概念與區別

    HarmonyOS如何使用異步并發能力進行開發

    一、并發概述 并發是指在同一時間段內,能夠處理多個任務的能力。為了提升應用的響應速度與幀率,以及防止耗時任務對主線程的干擾,HarmonyOS系統提供了異步并發和多
    的頭像 發表于 02-18 09:18 ?539次閱讀

    線程是什么的基本單位 進程線程的本質區別

    的代碼、數據以及用于執行這些代碼的上下文信息。一個進程可以由一個或多個線程組成,從而并發執行多個任務。 本質區別: 資源擁有方式:進程是資源分配的基本單位,每個
    的頭像 發表于 02-02 16:30 ?951次閱讀

    線程進程、多線程、多進程和多任務之間有何關系?

    進程是程序執行時的一個實例,即它是程序已經執行到課中程度的數據結構的匯集。從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。
    的頭像 發表于 01-11 13:39 ?366次閱讀
    <b class='flag-5'>線程</b>、<b class='flag-5'>進程</b>、多<b class='flag-5'>線程</b>、多<b class='flag-5'>進程</b>和多任務之間有何關系?

    mcu線程進程的區別是什么

    MCU線程進程是嵌入式系統中常見的并行執行的概念,它們之間有許多區別,包括線程進程的定義、資源管理、通信機制、執行方式等等。下面將詳細介紹MCU
    的頭像 發表于 01-04 10:45 ?766次閱讀
    主站蜘蛛池模板: 性天堂网| 国产香蕉75在线播放| 天天透天天操| 免费人成年短视频在线观看免费网站 | 在线精品91青草国产在线观看| 国产精品福利午夜在线观看| 中文字幕自拍| 在线中文天堂| 国产色视频网站免费观看| 久久久五月| 欧美一区二区三区免费高| 欧美区在线播放| 日韩综合色| 欧美性videofree精品| 久久久久久久国产精品电影| 国产三级在线看| 夜夜夜网| se94se欧美| 天天躁天天狠天天透| 久久国产乱子伦精品免费看| 天天干在线观看| 亚洲欲色| 三级黄色网| 神马国产| 操日韩| 高清视频在线播放| 国产在线视频网站| 可以免费播放的在线视频| 天天爱天天干天天操| 77788色淫免费网站视频| 午夜啪| 天天伊人网| 国产欧美精品午夜在线播放| 1515hh四虎免费观com| 六月丁香激情| 欧美乱淫| 丁香综合激情| 中国农村一级片| 欧美一区二区三区免费高| 国模在线| 台湾av|