日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

豁然開朗:這問題我不信你能分析的這么透徹!

來源: 責編: 時間:2023-10-10 18:32:06 327觀看
導讀本章難度:★★☆☆☆本章重點:掌握多個線程同時讀寫同一共享變量存在共享問題的根本原因,重點掌握CPU內存模式和Java內存模型的核心原理,緩存一致性問題及其產生的原因,并能夠根據CPU內存模型和Java內存模型編寫線程安全的
  • 本章難度:★★☆☆☆
  • 本章重點:掌握多個線程同時讀寫同一共享變量存在共享問題的根本原因,重點掌握CPU內存模式和Java內存模型的核心原理,緩存一致性問題及其產生的原因,并能夠根據CPU內存模型和Java內存模型編寫線程安全的代碼。

大家好,我是冰河~~61f28資訊網——每日最新資訊28at.com

“原來如此啊,真沒想到統計個調用商品詳情接口次數的功能背后還會牽扯到這么多知識點,這些知識之前確實沒聽說過,看來確實有很多我之前不知道的東西呀,以后跟著老大好好學,爭取跟他一樣厲害”,小菜默默的在心里嘀咕著。61f28資訊網——每日最新資訊28at.com

一、情景再現

小菜憑借著之前在學校的傳奇經歷順利進入一家頭部互聯網公司實習,幾天后,被分配到一個統計線上調用商品詳情接口的任務,本以為很簡單的功能,小菜也三下五除二的完成了開發任務,但是在測試時,卻被告知小菜統計出來的結果和實際結果差距太大。經過一天的排查和定位,小菜最終也沒有找出問題出在哪里。61f28資訊網——每日最新資訊28at.com

二、尋求幫助

第二天,小菜早早來到公司,還在思考著昨天為什么自己寫的代碼明明看起來沒問題,卻跟實際統計結果差距這么大。61f28資訊網——每日最新資訊28at.com

正當小菜還在糾結時,他突然聽到:“小菜,怎么樣了,知道昨天為什么會出現問題了嗎?”。61f28資訊網——每日最新資訊28at.com

小菜轉過頭一看,原來是自己的直屬領導老王到公司了,“沒有呀,我昨天下班后也在想這個問題,但是還是沒找到原因”。61f28資訊網——每日最新資訊28at.com

此時,小菜起身來到老王的工位旁邊,“老大,昨天我搞到很晚也沒發現啥問題,你可以給我講講哪里出了問題嗎?”。61f28資訊網——每日最新資訊28at.com

“可以”,老王一邊說著,一邊從電腦包里拿出自己的電腦。“其實,要搞清楚為啥昨天你寫的代碼會出問題,這就涉及到內存模型了,說到內存模型,就要從CPU內存模型和Java內存模型兩個方面進行講述了”。61f28資訊網——每日最新資訊28at.com

“這樣吧,小菜拿上筆和本,現在會議室沒人使用,我單獨給你講講”。61f28資訊網——每日最新資訊28at.com

“好的”,小菜邊說,邊回到工位拿筆和本子,老王則拿起了自己的電腦,二人一起到會議室走去。61f28資訊網——每日最新資訊28at.com

三、CPU內存模型

“以前了解過CPU內存模型嗎?”。61f28資訊網——每日最新資訊28at.com

“在學校聽老師講過,不過講的不夠深入和具體,我也了解的不多,我確實也想不出來這跟昨天實現的功能有啥關系”。61f28資訊網——每日最新資訊28at.com

“沒關系,我今天給你講一下”,老王邊說,邊打開了電腦和投影儀。61f28資訊網——每日最新資訊28at.com

“你昨天寫的代碼出問題,本質上與內存模型有關,說到內存模型呢,又會涉及到CPU內存模型和Java內存模型,我們先來講講CPU內存模型吧”,老王將自己的電腦投到投影儀上。61f28資訊網——每日最新資訊28at.com

“好的”,小菜邊聽邊在本子上記。61f28資訊網——每日最新資訊28at.com

老王接著說:“Java程序一般都是運行在JVM上,JVM本身有自己的內存模型,Java的內存模型其實與CPU的內存模型有很多相似之處。如果是CPU內存模型呢,計算機執行程序時,每條執行指令都是在CPU中執行的,并且在CPU執行指令的過程中就會涉及到數據的讀寫操作,CPU并不會直接從計算機的磁盤上讀數據,而是從計算機的主存,也就是我們常說的內存中讀取數據,并且CPU也會將處理的結果數據寫回主存”。61f28資訊網——每日最新資訊28at.com

老王一邊說,一邊在腦電上畫出了這樣一張圖,如圖2-1所示。61f28資訊網——每日最新資訊28at.com

圖片圖片61f28資訊網——每日最新資訊28at.com

“你在大學里應該學到過,其實CPU的執行速度是非常快的,會比內存的讀寫速度快的多”,老王畫完圖說道。61f28資訊網——每日最新資訊28at.com

“是的,這個我了解過”,小菜回應道。61f28資訊網——每日最新資訊28at.com

“CPU的執行速度和內存的讀寫速度存在巨大的速度差,這樣就會存在一個問題,由于CPU在處理任務時,需要從內存中讀取數據,內存的讀寫速度遠遠不及CPU的執行速度,這樣就會導致CPU的執行速度大大下降”。61f28資訊網——每日最新資訊28at.com

“為了解決這個問題,CPU的架構師們在CPU內部設計了一個高速緩沖區,用來平緩CPU執行速度與內存讀寫速度之間的差距。在執行時,會將CPU執行任務要讀取的數據從內存讀取到CPU的告訴緩沖區,然后CPU再從高速緩沖區讀取數據后執行任務。當CPU執行完任務,也是先將結果數據寫回到高速緩沖區,隨后再將高速緩沖區的數據刷新到內存,這樣CPU的執行效率就大大提升了,我們再來畫一張圖”。61f28資訊網——每日最新資訊28at.com

說完,老王又畫了一張圖,如圖2-2所示。61f28資訊網——每日最新資訊28at.com

圖片圖片61f28資訊網——每日最新資訊28at.com

“你可以記一下這張圖,這里咱們也暫時不展開講,如果展開講的話,會涉及到很多的知識點,比如CPU多級緩存架構,緩存一致性,偽共享,內存屏障等等很多知識點,一時半會兒也講不完,如果今天都講了的話,我估計你可能也消化不完,所以,關于CPU內存模型,今天就講到這里”。61f28資訊網——每日最新資訊28at.com

“好的”,小菜邊聽,邊拿本子記下了這張圖。61f28資訊網——每日最新資訊28at.com

“如果你對CPU多級緩存架構,緩存一致性,偽共享,內存屏障等等這些知識點感興趣,想進一步學習的話,我給你推薦一本書,就是冰河寫的《深入理解高并發編程:核心原理與案例實戰》這本書,這本書剖析了并發編程出現各種詭異Bug問題的根源,從本質上深度解析了并發編程的核心原理,并且給出了很實用的實戰案例,吃透這本書,對你學習并發編程幫助很大,這本書在京東和當當都在售”。老王繼續說道。61f28資訊網——每日最新資訊28at.com

“好的”,小菜也記下了這本書的書名,準備入手一本。61f28資訊網——每日最新資訊28at.com

“那我們再來講講Java內存模型”。61f28資訊網——每日最新資訊28at.com

四、Java內存模型

“說起Java內存模型,其實與CPU內存模型有很多相似的地方,只是說Java內存模型中屏蔽了不同操作系統和底層硬件之間的訪問差異,能夠在不同的操作系統和底層硬件之間達到一致的訪問效果”,老王一邊說,一邊畫圖,畫了一張線程、主內存、工作內存的關系圖,如圖2-3所示。61f28資訊網——每日最新資訊28at.com

圖片圖片61f28資訊網——每日最新資訊28at.com

“Java內存模型規定了所有的變量都存儲在主內存中,也就是存儲在計算機的物理內存中,每個線程都有自己的工作內存,用于存儲線程私有的數據,線程對變量的所有操作都需要在工作內存中完成。一個線程不能直接訪問其他線程工作內存中的數據,只能通過主內存進行數據交互。也就是說,線程在執行任務時,會先將數據從主內存復制到自己的工作內存,然后執行對應的任務,任務執行完畢后,會將計算的結果數據,從自己的工作內存刷新到主內存,這就與CPU內存模型很相似了”。61f28資訊網——每日最新資訊28at.com

老王邊說邊喝了口水,繼續道:“你先消化下,CPU內存模型和Java內存模型,接下來,我們再講講你昨天寫的代碼為啥會出問題”。61f28資訊網——每日最新資訊28at.com

“好的”,小菜回應道,隨后小菜就在本子上迅速的記著。。。61f28資訊網——每日最新資訊28at.com

五、緩存一致性問題

“好了,接下來,我們就來分析下你昨天代碼出現的問題原因吧”。61f28資訊網——每日最新資訊28at.com

“好的”。61f28資訊網——每日最新資訊28at.com

“我們還是先來看看你昨天寫的代碼”,老王一邊說,一邊打開開發環境,打開了小菜昨天寫的代碼。61f28資訊網——每日最新資訊28at.com

public class WrongCounter {    private int visitCount;    public void accessVisit(){        visitCount++;    }    public int getVisitCount() {        return visitCount;    }}

“現在我們就結合這個有問題的類來講,假設同一時刻有兩個線程調用了獲取商品詳情數據的接口,兩個線程都觸發了WrongCounter類中的accessVisit()方法。也就是說,兩個線程都執行了visitCount++操作,你知道visitCount++操作在內存中是如何執行的嗎?”,老王問小菜。61f28資訊網——每日最新資訊28at.com

“這個不太清楚”。61f28資訊網——每日最新資訊28at.com

“好的,那我們就來講一下,其實visitCount++操作總體上會在內存中分為三個步驟”。61f28資訊網——每日最新資訊28at.com

1.從主內存讀取visitCount的值。61f28資訊網——每日最新資訊28at.com

2.將visitCount的值進行加1操作。61f28資訊網——每日最新資訊28at.com

3.將visitCount的值寫回主內存。61f28資訊網——每日最新資訊28at.com

“我們一步步講,這樣你也好理解些”,老王繼續說,“我們先來看第1步:從主內存讀取visitCount的值。假設同一時刻有兩個線程同時調用了獲取商品詳情的接口,并且觸發了 visitCount++操作,此時結合Java內存模型看的話,就像這張圖一樣”。61f28資訊網——每日最新資訊28at.com

老王是真厲害,隨手又畫了一張圖,如圖2-4所示。61f28資訊網——每日最新資訊28at.com

圖片圖片61f28資訊網——每日最新資訊28at.com

“在步驟1從主內存讀取visitCount的值時,線程1和線程2都會把主內存中的visitCount值讀取到自己的工作內存中,此時線程1和線程2自身工作內存中的visitCount值都是0,這點能理解嗎?”。61f28資訊網——每日最新資訊28at.com

“能理解”,小菜回應道。61f28資訊網——每日最新資訊28at.com

“好,我們再來接著講第2步:將visitCount的值進行加1操作,還是畫一張圖看的清晰些”,老王又畫了一張圖,如圖2-5所示。61f28資訊網——每日最新資訊28at.com

圖片圖片61f28資訊網——每日最新資訊28at.com

“此時,線程1和線程2都將讀取到自己工作內存中的visitCount的值進行加1,此時線程1和線程2各自工作內存中的visitCount值都是1,這點能理解嗎?”。61f28資訊網——每日最新資訊28at.com

“能理解”。61f28資訊網——每日最新資訊28at.com

“好,我們再來看第3步:將visitCount的值寫回主內存,還是來一張圖”,老王確實厲害,隨手又畫了一張圖,如圖2-6所示。61f28資訊網——每日最新資訊28at.com

圖片圖片61f28資訊網——每日最新資訊28at.com

“線程1和線程2都會將自己計算出的結果數據寫到自身的工作內存,再刷新回主內存,在實際場景中,線程1和線程2的執行結果刷新回主內存的先后順序是隨機的,可能是線程1的結果先刷新回主內存,也可能是線程2的結果先刷新回主內存。但無論是先刷新線程1的結果,還是先刷新線程2的結果,最終主內存中的visitCount的值都是1,這與我們期望的結果不同,我們期望的結果是2,實際結果卻是1,這下明白昨天你寫的代碼為什么出問題了吧?”。61f28資訊網——每日最新資訊28at.com

“明白了,明白了”,小菜連忙回應道,”真沒想到寫個功能還牽扯到這么多知識點,真是又學到不少知識呀“。61f28資訊網——每日最新資訊28at.com

六、如何解決問題

“現在明白了昨天寫的代碼為何會出現問題,那知道怎么解決嗎?”,老王問。61f28資訊網——每日最新資訊28at.com

“大概知道點,但是不是很明白”。61f28資訊網——每日最新資訊28at.com

“好,那我們再講講怎么解決問題吧”。61f28資訊網——每日最新資訊28at.com

“好的”。61f28資訊網——每日最新資訊28at.com

“我們再次看看visitCount++操作在內存中的執行流程”。61f28資訊網——每日最新資訊28at.com

1.從主內存讀取visitCount的值。61f28資訊網——每日最新資訊28at.com

2.將visitCount的值進行加1操作。61f28資訊網——每日最新資訊28at.com

3.將visitCount的值寫回主內存。61f28資訊網——每日最新資訊28at.com

“既然visitCount++操作在內存中的執行流程會被分成3個步驟,那如果能夠保證這3個步驟的原子性,也就是說,線程1完全執行完畢這三個步驟,線程2再從主內存中讀取數據進行處理。或者線程2完全執行完畢這三個步驟,線程1再從主內存中讀取數據進行處理,這樣就能保證最終的結果數據與預期相符。這么說明白了嗎?”。61f28資訊網——每日最新資訊28at.com

“明白了”。61f28資訊網——每日最新資訊28at.com

“好的,那我們今天就講到這,根據今天我們講的內容,你把昨天寫的代碼嘗試修改下,不明白的地方再來問我”。61f28資訊網——每日最新資訊28at.com

“好的,謝謝你,老大,今天確實學到不少知識,回去我也好好總結下”。61f28資訊網——每日最新資訊28at.com

七、本章總結

本章,以故事場景的方式結合代碼問題,以圖文的形式重點介紹了CPU內存模型和Java內存模型,CPU內存模型和Java內存模型雖然平滑了CPU執行計算與讀寫主內存之間的速度差異,但是也引入了新的問題,那就是緩存一致性問題。本章,也結合代碼示例與圖文詳細介紹了緩存一致性問題。最后,簡單敘述了如何解決相關的問題。61f28資訊網——每日最新資訊28at.com

最后,可以在評論區寫下你學完本章節的收獲,祝大家都能學有所成,我們一起搞定高并發設計模式。61f28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-12743-0.html豁然開朗:這問題我不信你能分析的這么透徹!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用 Helm 管理應用的一些 Tips

下一篇: 如何利用快排的小技巧,解決算法難題?

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 電視息屏休眠仍有網絡上傳 愛奇藝被質疑“薅消費者羊毛”

    記者丨寧曉敏 見習生丨汗青出品丨鰲頭財經(theSankei) 前不久,愛奇藝發布了一份亮眼的一季報,不僅營收和會員營收創造歷史最佳表現,其運營利潤也連續6個月實現增長。自去年年初
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了——貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的“征求意見版”:1、取消P序列
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • OPPO K11采用全方位護眼屏:三大護眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發布,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
Top 主站蜘蛛池模板: 永清县| 漠河县| 宜宾市| 佛山市| 荆门市| 滨海县| 温泉县| 资中县| 同江市| 晋宁县| 福鼎市| 西林县| 嘉义县| 抚州市| 宁陵县| 仁布县| 瓦房店市| 池州市| 公安县| 泸水县| 板桥市| 东光县| 兴化市| 开原市| 即墨市| 临江市| 同江市| 中西区| 潞西市| 扎囊县| 岳阳市| 双鸭山市| 西乌| 永春县| 庆安县| 乐陵市| 白河县| 温泉县| 七台河市| 黎川县| 新兴县|