chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

并發(fā)的前提條件

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

也就是只有在多線程共享資源的情況下才可能產(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è)位置:磁盤、內(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都可以訪問(wèn)內(nèi)存中的數(shù)據(jù);

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

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

程序數(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è)線程,不太了解的讀者可以初步學(xué)習(xí)一下CPU時(shí)間片與線程調(diào)度的基本知識(shí)。

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

比如:a線程執(zhí)行count = count + 1操作,b線程也執(zhí)行相同的操作;當(dāng)a線程讀取到count的值,并進(jìn)行加1計(jì)算之后,還沒(méi)寫回到內(nèi)存之前被中斷,b線程完全執(zhí)行了count = count + 1,count的值得到更新;這時(shí)a線程恢復(fù)(并不會(huì)重新讀取并計(jì)算),將之前計(jì)算的值寫回到緩存,導(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)然重排序的前提是在單線程條件下的語(yǔ)義不變性,但不能保證多線程條件下語(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎ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

    文章

    2997

    瀏覽量

    115683
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

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

    關(guān)注

    0

    文章

    208

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Linux多線程對(duì)比單線程的優(yōu)勢(shì)

    ?!柑岣唔憫?yīng)性」:線程可以使程序更加響應(yīng)用戶輸入或其他事件,避免阻塞。線程相比單線程的優(yōu)點(diǎn):「并發(fā)性」:多線程可以同時(shí)執(zhí)行多個(gè)任務(wù),而單
    發(fā)表于 12-01 06:11

    飛凌嵌入式ElfBoard-文件I/O的了解探究之競(jìng)爭(zhēng)冒險(xiǎn)

    競(jìng)爭(zhēng)冒險(xiǎn)(Race Condition)指的是在多線程或多進(jìn)程環(huán)境中,多個(gè)線程進(jìn)程對(duì)共享資源進(jìn)行訪問(wèn)和修改時(shí)可能導(dǎo)致的不確定性結(jié)果或錯(cuò)誤行為。競(jìng)爭(zhēng)冒險(xiǎn)通常發(fā)生在多個(gè)
    發(fā)表于 11-26 15:38

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】—— linux創(chuàng)建線程

    線程進(jìn)程 一個(gè)進(jìn)程指的是一個(gè)正在執(zhí)行的應(yīng)用程序,而線程的功能是執(zhí)行應(yīng)用程序中的某個(gè)具體任務(wù)。線程具有傳統(tǒng)
    發(fā)表于 09-01 21:31

    Task任務(wù):LuatOS實(shí)現(xiàn)“任務(wù)級(jí)并發(fā)”的核心引擎

    Task任務(wù)通過(guò)其強(qiáng)大的并發(fā)處理能力,使LuatOS能夠在單線程環(huán)境中模擬多線程執(zhí)行,通過(guò)協(xié)程的掛起與恢復(fù)機(jī)制,實(shí)現(xiàn)任務(wù)級(jí)的并行操作,顯著提升系統(tǒng)效能。 sys核心庫(kù)是LuatOS運(yùn)行框架庫(kù),也是
    的頭像 發(fā)表于 08-28 13:49 ?337次閱讀
    Task任務(wù):LuatOS實(shí)現(xiàn)“任務(wù)級(jí)<b class='flag-5'>并發(fā)</b>”的核心引擎

    緩存之美:從根上理解 ConcurrentHashMap

    表的占用,以保持并發(fā)可讀性,次要目的是保持空間消耗與 HashMap 相同或更好,并支持利用多線程在空表上高效地插入初始值。在 Java 8 及之后的版本,使用 CAS 操作
    的頭像 發(fā)表于 08-05 14:48 ?417次閱讀

    什么是ArkTS?

    基礎(chǔ)類庫(kù)能力示意圖 提供異步并發(fā)和多線程并發(fā)的能力。 支持Promise和async/await等標(biāo)準(zhǔn)的JS異步并發(fā)能力。 TaskPool為應(yīng)用程序提供一個(gè)多
    發(fā)表于 06-17 06:24

    鴻蒙5開(kāi)發(fā)寶藏案例分享---應(yīng)用并發(fā)設(shè)計(jì)

    ?** 鴻蒙并發(fā)編程實(shí)戰(zhàn)指南:解鎖ArkTS多線程黑科技** 嘿,開(kāi)發(fā)者朋友們! 今天給大家扒一扒鴻蒙官方文檔里藏著的并發(fā)編程寶藏—— 100+實(shí)戰(zhàn)場(chǎng)景解決方案 !從金融理財(cái)?shù)接螒蜷_(kāi)發(fā),從折疊屏適配
    發(fā)表于 06-12 16:19

    HarmonyOS實(shí)戰(zhàn):一招解決等待多個(gè)并發(fā)結(jié)果

    講解開(kāi)發(fā)過(guò)程中遇到的并發(fā)問(wèn)題,官方API 11文檔寫的太簡(jiǎn)單了,根本沒(méi)有解決方案,小編也是苦思冥想,絞盡腦汁才找到解決方案。需要開(kāi)發(fā)鴻蒙的小伙伴可以仔細(xì)閱讀,避免踩坑。** 問(wèn)題 在開(kāi)發(fā)清除緩存的功能時(shí),鴻蒙NEXT提供的文檔中說(shuō)明,應(yīng)用緩存文件
    的頭像 發(fā)表于 06-09 14:57 ?401次閱讀
    HarmonyOS實(shí)戰(zhàn):一招解決等待多個(gè)<b class='flag-5'>并發(fā)</b>結(jié)果

    存儲(chǔ)示波器的觸發(fā)問(wèn)題及解決辦法

    觸發(fā)功能是示波器的核心,用于穩(wěn)定顯示信號(hào)波形。觸發(fā)問(wèn)題通常導(dǎo)致波形抖動(dòng)、不完整或無(wú)法捕獲目標(biāo)事件。以下是常見(jiàn)觸發(fā)問(wèn)題及針對(duì)性解決方案:一、觸發(fā)問(wèn)題分類與原因1. 無(wú)法觸發(fā)(波形不顯示或不穩(wěn)定) 原因
    發(fā)表于 04-09 14:39

    Linux進(jìn)程狀態(tài)詳解

    進(jìn)程狀態(tài)是task_struct內(nèi)的一個(gè)整數(shù);進(jìn)行:進(jìn)程在調(diào)度隊(duì)列中,進(jìn)程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進(jìn)程是一個(gè)隊(duì)列,設(shè)備也是一個(gè)隊(duì)列,當(dāng)我們讀磁盤,讀網(wǎng)
    的頭像 發(fā)表于 04-01 09:46 ?810次閱讀
    Linux<b class='flag-5'>進(jìn)程</b>狀態(tài)詳解

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

    是(每個(gè)進(jìn)程可以跑在不同CPU) 是(線程可以分配到不同核) 否(只能在一個(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)多線程與多進(jìn)程的協(xié)作?

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

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

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

    RK3568驅(qū)動(dòng)指南|第三篇-并發(fā)與競(jìng)爭(zhēng)-第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)

    RK3568驅(qū)動(dòng)指南|第三篇-并發(fā)與競(jìng)爭(zhēng)-第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)
    的頭像 發(fā)表于 02-24 16:26 ?851次閱讀
    RK3568驅(qū)動(dòng)指南|第三篇-<b class='flag-5'>并發(fā)</b>與競(jìng)爭(zhēng)-第19章 <b class='flag-5'>并發(fā)</b>與競(jìng)爭(zhēng)實(shí)驗(yàn)

    開(kāi)源大模型DeepSeek的開(kāi)放內(nèi)容

    當(dāng)大家討論為什么 DeepSeek 能夠形成全球刷屏之勢(shì),讓所有廠商、平臺(tái)都集成之時(shí),「開(kāi)源」成為了最大的關(guān)鍵詞之一,圖靈獎(jiǎng)得主 Yann LeCun 稱其是「開(kāi)源的勝利」。模型開(kāi)源一直備受關(guān)注,從代碼、數(shù)據(jù)到模型的完全開(kāi)源是人們渴求的方向。那么 DeepSeek 的開(kāi)源究竟開(kāi)放了什么?開(kāi)放到了何種程度?本文作者——資深程序員+資深律師,一起為大家拆解 DeepSeek 的開(kāi)源之道。 【寫在前面】DeepSeek 是目前可以和閉源大模型媲美的開(kāi)源大模型,DeepSeek 許可證是
    的頭像 發(fā)表于 02-19 09:48 ?2422次閱讀
    開(kāi)源大模型DeepSeek的開(kāi)放內(nèi)容<b class='flag-5'>詳</b><b class='flag-5'>析</b>