女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳析Java線(xiàn)程進(jìn)程的并發(fā)問(wèn)題

如意 ? 來(lái)源:IT技術(shù)百貨 ? 作者:IT技術(shù)百貨 ? 2020-07-07 11:44 ? 次閱讀

并發(fā)的前提條件

并發(fā)問(wèn)題發(fā)生的前提條件一定是資源共享,這里的資源一般指的是數(shù)據(jù),共享指的是多線(xiàn)程之間共享。

也就是只有在多線(xiàn)程共享資源的情況下才可能產(chǎn)生并發(fā)問(wèn)題,這是并發(fā)問(wèn)題產(chǎn)生的前提條件,在這個(gè)條件下,有可能產(chǎn)生并發(fā)問(wèn)題,那么并發(fā)問(wèn)題的根源究竟是什么呢?

CPU操作數(shù)據(jù)的基本機(jī)制

前面提到了并發(fā)的前提條件是數(shù)據(jù)共享,想了解并發(fā)問(wèn)題的根源就需要知道CPU操作數(shù)據(jù)的基本原理;

數(shù)據(jù)存儲(chǔ)包括這幾個(gè)位置:磁盤(pán)、內(nèi)存、緩存、寄存器

寄存器可以認(rèn)為是CPU的一部分,所以有的地方并沒(méi)有將CPU和寄存器拆分講解,通常來(lái)講只需要知道CPU運(yùn)算時(shí)都是從寄存器取數(shù)據(jù),運(yùn)算完成后再放回寄存器即可,CPU和寄存器之間沒(méi)有其他任何中介。

緩存是CPU與寄存器之外的一層存儲(chǔ),但也是每一個(gè)CPU獨(dú)立占有的一塊內(nèi)存區(qū)域,各個(gè)CPU緩存之間數(shù)據(jù)不可以共享。

內(nèi)存是程序運(yùn)行時(shí)數(shù)據(jù)的主要存放區(qū)域,內(nèi)存數(shù)據(jù)是共享的,一般來(lái)講,各個(gè)CPU都可以訪(fǎng)問(wèn)內(nèi)存中的數(shù)據(jù);

磁盤(pán),數(shù)據(jù)最終持久化的存儲(chǔ);

CPU操作數(shù)據(jù)的流程一般是先由磁盤(pán)讀到內(nèi)存,再?gòu)膬?nèi)存讀到緩存,再由緩存到寄存器進(jìn)行運(yùn)算;運(yùn)算之后的結(jié)果直接寫(xiě)入寄存器,然后刷新到緩存,再刷新到內(nèi)存,最后寫(xiě)入磁盤(pán);

程序數(shù)據(jù)流圖

并發(fā)問(wèn)題的源頭

了解了CPU運(yùn)行機(jī)制之后,下面說(shuō)并發(fā)問(wèn)題的根源,主要是由于數(shù)據(jù)可見(jiàn)性、操作原子性、操作有序性這三個(gè)原因?qū)е碌模?/p>

什么是數(shù)據(jù)可見(jiàn)性?

通俗點(diǎn)來(lái)說(shuō)就是CPU看到的數(shù)據(jù)并不是最新的數(shù)據(jù),CPU讀取數(shù)據(jù)是優(yōu)先從緩存中讀取,如果緩存中存在就使用緩存中的數(shù)據(jù),假如數(shù)據(jù)被另一個(gè)CPU改變了,這時(shí)其他CPU中緩存數(shù)據(jù)就可能與內(nèi)存中的數(shù)據(jù)不一致,也就是CPU沒(méi)有看到并使用最新的數(shù)據(jù),導(dǎo)致程序執(zhí)行結(jié)果異常。

什么是操作原子性?

同一個(gè)CPU可以交替執(zhí)行多個(gè)線(xiàn)程,不太了解的讀者可以初步學(xué)習(xí)一下CPU時(shí)間片與線(xiàn)程調(diào)度的基本知識(shí)。

在同一個(gè)CPU,交替執(zhí)行多個(gè)線(xiàn)程的時(shí)候,就可能出現(xiàn)線(xiàn)程中斷,并且在中斷過(guò)程中受其他線(xiàn)程影響而導(dǎo)致中斷的線(xiàn)程恢復(fù)之后,執(zhí)行邏輯異常。

比如:a線(xiàn)程執(zhí)行count = count + 1操作,b線(xiàn)程也執(zhí)行相同的操作;當(dāng)a線(xiàn)程讀取到count的值,并進(jìn)行加1計(jì)算之后,還沒(méi)寫(xiě)回到內(nèi)存之前被中斷,b線(xiàn)程完全執(zhí)行了count = count + 1,count的值得到更新;這時(shí)a線(xiàn)程恢復(fù)(并不會(huì)重新讀取并計(jì)算),將之前計(jì)算的值寫(xiě)回到緩存,導(dǎo)致count本來(lái)應(yīng)該執(zhí)行兩次加1,但最終結(jié)果只加了一次1;

什么是操作有序性?

有序性指的是CPU執(zhí)行代碼的順序和程序開(kāi)發(fā)者定義的順序不一致?為什么還會(huì)不一致呢?

編譯器在將高級(jí)開(kāi)發(fā)語(yǔ)言編譯成計(jì)算機(jī)指令的時(shí)候,出于性能優(yōu)化,可能會(huì)對(duì)代碼執(zhí)行重排序,CPU在執(zhí)行指令的時(shí)候,也可能對(duì)代碼重排序;當(dāng)然重排序的前提是在單線(xiàn)程條件下的語(yǔ)義不變性,但不能保證多線(xiàn)程條件下語(yǔ)義也相同。

Java單例模式中的雙重校驗(yàn)鎖,單例變量為什么要聲明為volatile,就是為了解決指令重排序帶來(lái)的問(wèn)題,我們?cè)谙乱徽鹿?jié)進(jìn)行詳細(xì)講解。感興趣的也可以自行查閱資料學(xué)習(xí)。

并發(fā)問(wèn)題的解決方案

并發(fā)問(wèn)題不是Java語(yǔ)言特有的,而是計(jì)算機(jī)運(yùn)行原理與操作系統(tǒng)帶來(lái)的,那么從計(jì)算機(jī)與操作系統(tǒng)層面來(lái)看,它們都提供了哪些解決方案來(lái)避免數(shù)據(jù)可見(jiàn)性、程序原子性、操作有序性的保障呢?Java語(yǔ)言又是如何對(duì)這些方案進(jìn)行封裝的呢?開(kāi)發(fā)者有哪些手段可以解決這些問(wèn)題呢?

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106841
  • 線(xiàn)程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20070
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    206

    瀏覽量

    14211
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    進(jìn)程線(xiàn)程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    是(每個(gè)進(jìn)程可以跑在不同CPU) 是(線(xiàn)程可以分配到不同核) 否(只能在一個(gè)核上蹦迪) 適用場(chǎng)景 銀行系統(tǒng)、docker容器 視頻渲染、實(shí)時(shí)音視頻 微信客服、高并發(fā)Web服務(wù)器 社死案例 進(jìn)
    發(fā)表于 03-26 09:27

    請(qǐng)問(wèn)如何在Python中實(shí)現(xiàn)多線(xiàn)程與多進(jìn)程的協(xié)作?

    大家好!我最近在開(kāi)發(fā)一個(gè)Python項(xiàng)目時(shí),需要同時(shí)處理多個(gè)任務(wù),且每個(gè)任務(wù)需要不同的計(jì)算資源。我想通過(guò)多線(xiàn)程和多進(jìn)程的組合來(lái)實(shí)現(xiàn)并發(fā),但遇到了一些問(wèn)題。 具體來(lái)說(shuō),我有兩個(gè)任務(wù),一個(gè)是I/O密集型
    發(fā)表于 03-11 06:57

    摩爾線(xiàn)程支持DeepSeek開(kāi)源通信庫(kù)DeepEP和并行算法DualPipe

    DeepSeek開(kāi)源周第四日,摩爾線(xiàn)程宣布已成功支持DeepSeek開(kāi)源通信庫(kù)DeepEP和并行算法DualPipe,并發(fā)布相關(guān)開(kāi)源代碼倉(cāng)庫(kù):MT-DeepEP和MT-DualPipe。
    的頭像 發(fā)表于 02-28 15:58 ?416次閱讀

    socket 多線(xiàn)程編程實(shí)現(xiàn)方法

    是指在同一個(gè)進(jìn)程中運(yùn)行多個(gè)線(xiàn)程,每個(gè)線(xiàn)程可以獨(dú)立執(zhí)行任務(wù)。線(xiàn)程共享進(jìn)程的資源,如內(nèi)存空間和文件句柄,但每個(gè)
    的頭像 發(fā)表于 11-12 14:16 ?879次閱讀

    加鎖失效,非鎖之過(guò),加之錯(cuò)也

    引言 多個(gè)進(jìn)程線(xiàn)程同時(shí)(或著說(shuō)在同一段時(shí)間內(nèi))訪(fǎng)問(wèn)同一資源會(huì)產(chǎn)生并發(fā)問(wèn)題。 ? ? 銀行兩操作員同時(shí)操作同一賬戶(hù)就是典型的例子。比如A、B操作員同時(shí)讀取一余額為1000元的賬戶(hù),A操作員為該賬戶(hù)
    的頭像 發(fā)表于 11-05 17:52 ?505次閱讀
    加鎖失效,非鎖之過(guò),加之錯(cuò)也

    一文搞懂Linux進(jìn)程的睡眠和喚醒

    機(jī)制 1)信號(hào)(Signal): 進(jìn)程可以通過(guò)接受特定信號(hào)被喚醒。 2)條件變量(Condition Variable): 多線(xiàn)程編程中用于同步多個(gè)線(xiàn)程的工具,可以讓一個(gè)線(xiàn)程在某些
    發(fā)表于 11-04 15:15

    go語(yǔ)言如何解決并發(fā)問(wèn)

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

    Python中多線(xiàn)程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線(xiàn)程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python中多線(xiàn)程與多進(jìn)
    的頭像 發(fā)表于 10-23 11:48 ?905次閱讀
    Python中多<b class='flag-5'>線(xiàn)程</b>和多<b class='flag-5'>進(jìn)程</b>的區(qū)別

    CPU線(xiàn)程和程序線(xiàn)程的區(qū)別

    CPU的線(xiàn)程與程序的線(xiàn)程在概念、作用、實(shí)現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對(duì)兩者區(qū)別的詳細(xì)闡述,旨在深入探討這一技術(shù)話(huà)題。
    的頭像 發(fā)表于 09-02 11:18 ?1908次閱讀

    三十分鐘入門(mén)基礎(chǔ)Go Java小子版

    語(yǔ)法與 C 相近,但功能上有:內(nèi)存安全,GC,結(jié)構(gòu)形態(tài)及 CSP-style 并發(fā)計(jì)算。 適用范圍 本篇文章適用于學(xué)習(xí)過(guò)其他面向?qū)ο笳Z(yǔ)言(Java、Php),但沒(méi)有學(xué)過(guò)Go語(yǔ)言的初學(xué)者。文章 主要從Go
    的頭像 發(fā)表于 08-12 14:32 ?934次閱讀
    三十分鐘入門(mén)基礎(chǔ)Go <b class='flag-5'>Java</b>小子版

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    Java Web和Java是兩個(gè)不同的概念,它們?cè)诠δ堋⒂猛竞蛯?shí)現(xiàn)方式上存在一些區(qū)別,下面將詳細(xì)介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語(yǔ)言,它提供了一種用于開(kāi)發(fā)各種應(yīng)用程序
    的頭像 發(fā)表于 07-16 13:35 ?1349次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別

    從多線(xiàn)程設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    最近在開(kāi)發(fā) 延保服務(wù) 頻道頁(yè)時(shí),為了提高查詢(xún)效率,使用到了多線(xiàn)程技術(shù)。為了對(duì)多線(xiàn)程方案設(shè)計(jì)有更加充分的了解,在業(yè)余時(shí)間讀完了《圖解 Java線(xiàn)程設(shè)計(jì)模式》這本書(shū),覺(jué)得收獲良多。本篇
    的頭像 發(fā)表于 06-26 14:18 ?604次閱讀
    從多<b class='flag-5'>線(xiàn)程</b>設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    探索虛擬線(xiàn)程:原理與實(shí)現(xiàn)

    虛擬線(xiàn)程的引入與優(yōu)勢(shì) 在Loom項(xiàng)目之前,Java虛擬機(jī)(JVM)中的線(xiàn)程是通過(guò)java.lang.Thread類(lèi)型來(lái)實(shí)現(xiàn)的,這些線(xiàn)程被稱(chēng)為
    的頭像 發(fā)表于 06-24 11:35 ?518次閱讀
    探索虛擬<b class='flag-5'>線(xiàn)程</b>:原理與實(shí)現(xiàn)

    動(dòng)態(tài)線(xiàn)程池思想學(xué)習(xí)及實(shí)踐

    相關(guān)文檔 美團(tuán)線(xiàn)程池實(shí)踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線(xiàn)程池思想解析:https
    的頭像 發(fā)表于 06-13 15:43 ?1468次閱讀
    動(dòng)態(tài)<b class='flag-5'>線(xiàn)程</b>池思想學(xué)習(xí)及實(shí)踐

    一句話(huà)讓你理解線(xiàn)程進(jìn)程

    今天給大家分享一下線(xiàn)程進(jìn)程,主要包含以下幾部分內(nèi)容:一句話(huà)說(shuō)明線(xiàn)程進(jìn)程操作系統(tǒng)為什么需要進(jìn)程為什么要引入
    的頭像 發(fā)表于 06-04 08:04 ?1520次閱讀
    一句話(huà)讓你理解<b class='flag-5'>線(xiàn)程</b>和<b class='flag-5'>進(jìn)程</b>