在线观看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
    +關注

    關注

    20

    文章

    2986

    瀏覽量

    107040
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    20098
  • 進程
    +關注

    關注

    0

    文章

    206

    瀏覽量

    14228
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

    摩爾線程支持DeepSeek開源通信庫DeepEP和并行算法DualPipe

    DeepSeek開源周第四日,摩爾線程宣布已成功支持DeepSeek開源通信庫DeepEP和并行算法DualPipe,并發布相關開源代碼倉庫:MT-DeepEP和MT-DualPipe。
    的頭像 發表于 02-28 15:58 ?445次閱讀

    國產GPU獨角獸摩爾線程啟動上市輔導

    近日,國內GPU領域的獨角獸企業摩爾線程正式在北京證監局辦理了上市輔導備案登記,標志著其A股上市進程已全面啟動。此次輔導機構選定為中信證券,將為摩爾線程的上市之路提供有力支持。
    的頭像 發表于 11-14 14:21 ?517次閱讀

    socket 多線程編程實現方法

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

    加鎖失效,非鎖之過,加之錯也

    引言 多個進程線程同時(或著說在同一段時間內)訪問同一資源會產生并發問題。 ? ? 銀行兩操作員同時操作同一賬戶就是典型的例子。比如A、B操作員同時讀取一余額為1000元的賬戶,A操作員為該賬戶
    的頭像 發表于 11-05 17:52 ?520次閱讀
    加鎖失效,非鎖之過,加之錯也

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

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

    go語言如何解決并發問

    作為一個后端開發,日常工作中接觸最多的兩門語言就是PHP和GO了。無可否認,PHP確實是最好的語言(手動狗頭哈哈),寫起來真的很舒爽,沒有任何心智負擔,字符串和整型壓根就不用區分,開發速度真的是比GO快很多。現在工作中也還是有一些老項目在使用PHP,但21年之后的新項目基本上就都是用GO了。那為什么PHP那么香,還要轉戰使用GO呢,下面就給大家講解一下我們新項目從PHP轉GO的原因,有幾個比較重要的點:
    的頭像 發表于 10-23 13:38 ?436次閱讀
    go語言如何解決<b class='flag-5'>并發問</b>題

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

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

    CPU線程和程序線程的區別

    CPU的線程與程序的線程在概念、作用、實現方式以及性能影響等方面存在顯著差異。以下是對兩者區別的詳細闡述,旨在深入探討這一技術話題。
    的頭像 發表于 09-02 11:18 ?1968次閱讀

    三十分鐘入門基礎Go Java小子版

    語法與 C 相近,但功能上有:內存安全,GC,結構形態及 CSP-style 并發計算。 適用范圍 本篇文章適用于學習過其他面向對象語言(Java、Php),但沒有學過Go語言的初學者。文章 主要從Go
    的頭像 發表于 08-12 14:32 ?946次閱讀
    三十分鐘入門基礎Go <b class='flag-5'>Java</b>小子版

    華納云:java web和java有什么區別java web和java有什么區別

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現方式上存在一些區別,下面將詳細介紹它們之間的區別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發各種應用程序
    的頭像 發表于 07-16 13:35 ?1383次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別

    從多線程設計模式到對 CompletableFuture 的應用

    最近在開發 延保服務 頻道頁時,為了提高查詢效率,使用到了多線程技術。為了對多線程方案設計有更加充分的了解,在業余時間讀完了《圖解 Java線程設計模式》這本書,覺得收獲良多。本篇
    的頭像 發表于 06-26 14:18 ?626次閱讀
    從多<b class='flag-5'>線程</b>設計模式到對 CompletableFuture 的應用

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

    虛擬線程的引入與優勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現的,這些線程被稱為
    的頭像 發表于 06-24 11:35 ?542次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現
    主站蜘蛛池模板: 亚洲人成www在线播放 | 国产色婷婷精品综合在线 | 亚洲网站免费观看 | 在线免费色视频 | 五月激情久久 | 四虎网址大全 | 特级毛片永久久免费观看 | 免费观看在线永久免费xx视频 | 五月天婷婷在线观看视频 | 久久在线精品 | 加勒比一本一道在线 | 欧美性猛交xxxx免费看久久 | 色综合久久久高清综合久久久 | 日本xxxx69| 欧美综合一区二区三区 | 天天干夜夜看 | 天天看片天天干 | 日本黄色小视频网站 | 黄色永久网站 | 人人搞人人爱 | 欧美性色黄大片四虎影视 | 日韩精品免费一区二区三区 | 免费看片免费播放 | av72成人| 四虎最新视频 | 天天综合网天天做天天受 | 亚洲卡一卡2卡三卡4卡国色 | 五月激情婷婷丁香 | 天天干天天插 | 亚洲男人的天堂久久香蕉 | 亚洲插插插 | 免费爱爱网 | 97在线精品 | 欧美色图在线视频 | 免费黄色三级网站 | 性欧美暴力猛交69hd | 美女一区二区三区 | 激情婷婷综合 | 国产黄色大片又色又爽 | 色老头久久网 | 亚洲五月综合缴情婷婷 |