成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Java并發(fā)】Java并發(fā)編程與高并發(fā)基礎(chǔ)概念

stackfing / 1900人閱讀

摘要:筆記來源并發(fā)編程與高并發(fā)解決方案并發(fā)基礎(chǔ)綜述多級(jí)緩存緩存一致性亂序執(zhí)行優(yōu)化內(nèi)存模型規(guī)定抽象結(jié)構(gòu)同步八種操作及規(guī)則并發(fā)的優(yōu)勢(shì)與風(fēng)險(xiǎn)并發(fā)與高并發(fā)基本概念基本概念并發(fā)同時(shí)擁有兩個(gè)或者多個(gè)線程,如果程序在單核處理器上運(yùn)行,多個(gè)線程將交替地?fù)Q入或者換

筆記來源:【IMOOC】Java并發(fā)編程與高并發(fā)解決方案
并發(fā)基礎(chǔ)

綜述:

CPU多級(jí)緩存:緩存一致性、亂序執(zhí)行優(yōu)化

Java內(nèi)存模型:JMM規(guī)定、抽象結(jié)構(gòu)、同步八種操作及規(guī)則

Java并發(fā)的優(yōu)勢(shì)與風(fēng)險(xiǎn)

并發(fā)與高并發(fā)基本概念 基本概念

并發(fā):同時(shí)擁有兩個(gè)或者多個(gè)線程,如果程序在單核處理器上運(yùn)行,多個(gè)線程將交替地?fù)Q入或者換出內(nèi)存,這些線程是同時(shí)“存在”的,每個(gè)線程都處于執(zhí)行過程中的某個(gè)狀態(tài),如果運(yùn)行在多核處理器上,此時(shí),程序中的每個(gè)線程都將分配到一個(gè)處理器核上,因此可以同時(shí)運(yùn)行。

高并發(fā):高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,通過設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并行處理很多請(qǐng)求。

并發(fā):多個(gè)線程操作相同的資源,保證線程安全,合理使用資源

高并發(fā):服務(wù)器能同時(shí)處理很多請(qǐng)求,提高程序性能

知識(shí)技能

總體架構(gòu):Spring Boot、Maven、JDK8、MySQL

基礎(chǔ)組件:Mybatis、Guava、Lombok、Redis、Kafka

高級(jí)組件/類:Joda-Time、Atomic包、J.U.C、AQS、ThreadLocal、RateLimiter、Hystrix、threadPool、shardbatis、curator、elastic-job...

CPU多級(jí)緩存-緩存一致性 CPU多級(jí)緩存

為什么需要CPU cache:CPU的頻率太快了,快到主存跟不上,這樣在處理器時(shí)鐘周期內(nèi),CPU常常需要等待主存,浪費(fèi)資源。所以cache的出現(xiàn),是為了緩解CPU和內(nèi)存之間速度的不匹配問題(結(jié)構(gòu):CPU -> cache -> memory)。

CPU cache有什么意義

時(shí)間局部性:如果某個(gè)數(shù)據(jù)被訪問,那么在不久的將來它很可能被再次訪問;

空間局部性:如果某個(gè)數(shù)據(jù)被訪問,那么與它相鄰的數(shù)據(jù)很快也可能被訪問。

緩存一致性(MESI)

用于保證多個(gè)CPU cache之間緩存共享數(shù)據(jù)的一致性

MESI協(xié)議中的狀態(tài)

M: Modified 修改:指的是該緩存行只被緩存在該CPU的緩存中,并且是被修改過的,因此他與主存中的數(shù)據(jù)是不一致的,該緩存行中的數(shù)據(jù)需要在未來的某個(gè)時(shí)間點(diǎn)(允許其他CPU讀取主存相應(yīng)中的內(nèi)容之前)寫回主存,然后狀態(tài)變成E(獨(dú)享)

E:Exclusive 獨(dú)享:指的是該緩存行只被緩存在該CPU的緩存中,是未被修改過的,與主存的數(shù)據(jù)是一致的,可以在任何時(shí)刻當(dāng)有其他CPU讀取該內(nèi)存時(shí),變成S(共享)狀態(tài),當(dāng)CPU修改該緩存行的內(nèi)容時(shí),變成M(被修改)的狀態(tài)

S:Share 共享:意味著該緩存行可能會(huì)被多個(gè)CPU進(jìn)行緩存,并且該緩存中的數(shù)據(jù)與主存數(shù)據(jù)是一致的,當(dāng)有一個(gè)CPU修改該緩存行時(shí),其他CPU是可以被作廢的,變成I(無效的)

I:Invalid 無效:代表這個(gè)緩存是無效的,可能是有其他CPU修改了該緩存行

local read:讀本地緩存的數(shù)據(jù)

local write:將數(shù)據(jù)寫到本地緩存里面

remote read:將內(nèi)(主)存中的數(shù)據(jù)讀取到緩存中來

remote write:將緩存中的數(shù)據(jù)寫會(huì)到主存里面

CPU多級(jí)緩存-亂序執(zhí)行優(yōu)化

處理器為提高運(yùn)算速度而作出違背代碼原有順序的優(yōu)化

JAVA內(nèi)存模型(Java Memory Model,JMM) Java 內(nèi)存模型

Heap(堆):java里的堆是一個(gè)運(yùn)行時(shí)的數(shù)據(jù)區(qū),堆是由垃圾回收來負(fù)責(zé)的,堆的優(yōu)勢(shì)是可以動(dòng)態(tài)的分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的,java的垃圾回收器會(huì)定時(shí)收走不用的數(shù)據(jù),缺點(diǎn)是由于要在運(yùn)行時(shí)動(dòng)態(tài)分配,所以存取速度可能會(huì)慢一些。

Stack(棧):棧的優(yōu)勢(shì)是存取速度比堆要快,僅次于計(jì)算機(jī)里的寄存器,棧的數(shù)據(jù)是可以共享的,缺點(diǎn)是存在棧中的數(shù)據(jù)的大小與生存期必須是確定的,缺乏一些靈活性。棧中主要存放一些基本類型的變量,比如 int,short,long,byte,double,float,boolean,char,對(duì)象句柄。

java內(nèi)存模型要求調(diào)用棧和本地內(nèi)存變量存放在線程棧(Thread Stack)上,對(duì)象存放在堆上。一個(gè)本地變量可能存放一個(gè)對(duì)象的引用,這時(shí)引用變量存放在本地棧上,但是對(duì)象本身存放在堆上,成員變量跟隨著對(duì)象存放在堆上,而不管是原始類型還是引用類型,靜態(tài)成員變量跟隨著類的定義一起存在在堆上。存在堆上的對(duì)象,可以被持有這個(gè)對(duì)象的引用的線程訪問。如果兩個(gè)線程同時(shí)訪問同一個(gè)對(duì)象的私有變量,這時(shí)他們獲得的是這個(gè)對(duì)象的私有拷貝。
計(jì)算機(jī)硬件架構(gòu)

JVM 與硬件內(nèi)存架構(gòu)的關(guān)聯(lián)

Java內(nèi)存模型抽象結(jié)構(gòu)

Java內(nèi)存模型-同步八種操作

lock(鎖定):作用于主內(nèi)存的變量,把一個(gè)變量標(biāo)識(shí)為一條線程獨(dú)占狀態(tài)

unlock(解鎖):作用于主內(nèi)存的變量,把一個(gè)處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定

read(讀取):作用于主內(nèi)存的變量,把一個(gè)變量值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的load動(dòng)作使用

load(載入):作用于工作內(nèi)存的變量,它把read操作從內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中

use(使用):作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個(gè)變量值傳遞給執(zhí)行引擎

assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)從執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量

store(存儲(chǔ)):作用于工作內(nèi)存的變量,把工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write的操作

write(寫入):作用于主內(nèi)存的變量,它把store操作從工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存的變量中

Java內(nèi)存模型-同步規(guī)則

如果要把一個(gè)變量從主內(nèi)存中復(fù)制到工作內(nèi)存,就需要按順序地執(zhí)行read和load操作,如果把變量從工作內(nèi)存中同步回主內(nèi)存中,就要按順序地執(zhí)行store和write操作。但Java內(nèi)存模型只要求上述操作必須按順序執(zhí)行,而沒有保證必須是連續(xù)執(zhí)行

不允許read和load、store和write操作之一多帶帶出現(xiàn)

不允許一個(gè)線程丟棄它的最近assign操作,即變量在工作內(nèi)存中改變了之后必須同步到主內(nèi)存中

不允許一個(gè)線程無原因地(沒有發(fā)生過任何assign操作)把數(shù)據(jù)從工作內(nèi)存同步回主內(nèi)存中

一個(gè)新的變量只能再主內(nèi)存中誕生,不允許在工作內(nèi)存中直接使用一個(gè)未被初始化(load或assign)的變量。即就是對(duì)一個(gè)變量實(shí)施use和store操作之前,必須先執(zhí)行過了assign和load操作

一個(gè)變量在同一時(shí)刻只允許一條線程對(duì)其進(jìn)行l(wèi)ock操作,但lock操作可以被同一條線程重復(fù)執(zhí)行多次,多次執(zhí)行l(wèi)ock后,只有執(zhí)行相同次數(shù)的unlock操作,變量才會(huì)被解鎖。lock和unlock必須成對(duì)出現(xiàn)

如果對(duì)一個(gè)變量執(zhí)行l(wèi)ock操作,將會(huì)清空工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個(gè)變量前需要重新執(zhí)行l(wèi)oad或assign操作初始化變量的值

如果一個(gè)變量事先沒有被lock操作鎖定,則不允許對(duì)它執(zhí)行unlock操作;也不允許去unlock一個(gè)被其他線程鎖定的變量

對(duì)一個(gè)變量執(zhí)行unlock操作之前,必須先把此變量同步到主內(nèi)存中(執(zhí)行store和write操作)

Java內(nèi)存模型-同步操作與規(guī)則

并發(fā)的優(yōu)勢(shì)與風(fēng)險(xiǎn)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68996.html

相關(guān)文章

  • 長(zhǎng)文慎入-探索Java并發(fā)編程與高并發(fā)解決方案

    摘要:所有示例代碼請(qǐng)見下載于基本概念并發(fā)同時(shí)擁有兩個(gè)或者多個(gè)線程,如果程序在單核處理器上運(yùn)行多個(gè)線程將交替地?fù)Q入或者換出內(nèi)存這些線程是同時(shí)存在的,每個(gè)線程都處于執(zhí)行過程中的某個(gè)狀態(tài),如果運(yùn)行在多核處理器上此時(shí),程序中的每個(gè)線程都 所有示例代碼,請(qǐng)見/下載于 https://github.com/Wasabi1234... showImg(https://upload-images.jians...

    SimpleTriangle 評(píng)論0 收藏0
  • 做IT這幾年,我整理了這些干貨想要送給你!

    摘要:資源獲取方式根據(jù)下面的索引,大家可以選擇自己需要的資源,然后在松哥公眾號(hào)牧碼小子后臺(tái)回復(fù)對(duì)應(yīng)的口令,就可以獲取到資源的百度云盤下載地址。公眾號(hào)二維碼如下另外本文會(huì)定期更新,松哥有新資源的時(shí)候會(huì)及時(shí)分享給大家,歡迎各位小伙伴保持關(guān)注。 沒有一條路是容易的,特別是轉(zhuǎn)行計(jì)算機(jī)這條路。 松哥接觸過很多轉(zhuǎn)行做開發(fā)的小伙伴,我了解到很多轉(zhuǎn)行人的不容易,記得松哥大二時(shí)剛剛決定轉(zhuǎn)行計(jì)算機(jī),完全不知道這...

    王晗 評(píng)論0 收藏0
  • 馬士兵MCA架構(gòu)師Java互聯(lián)網(wǎng)架構(gòu)師

    摘要:如果是這樣,你一定要拿出個(gè)小時(shí)的時(shí)間,參加一次馬士兵老師的多線程與高并發(fā)訓(xùn)練營(yíng)。橫掃一切關(guān)于多線程的問題,吊打所有敢于提問并發(fā)問題的面試官。 如果你平時(shí)只有CRUD的經(jīng)驗(yàn),從來不會(huì)了解多線程與高并發(fā),相信你一定一頭霧水。如果是這樣,你一定要拿出4個(gè)小時(shí)的時(shí)間,參加一次馬士兵老師的《多線程與高并發(fā)》訓(xùn)練營(yíng)。讓骨灰級(jí)掃地神僧馬...

    dantezhao 評(píng)論0 收藏0
  • 多線程編程完全指南

    摘要:在這個(gè)范圍廣大的并發(fā)技術(shù)領(lǐng)域當(dāng)中多線程編程可以說是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問題的構(gòu)思與解決都是基于多線程模型來進(jìn)行的。一般來說,多線程程序會(huì)面臨三類問題正確性問題效率問題死鎖問題。 多線程編程或者說范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯(cuò)的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險(xiǎn)艱辛地學(xué)習(xí)各種多線程編程技術(shù)、解決各種并發(fā)問題呢? 因?yàn)椴l(fā)是整個(gè)分布式集群的基礎(chǔ),通過分布式集群不僅可以大...

    mengera88 評(píng)論0 收藏0
  • Java并發(fā)】線程安全性

    摘要:另一個(gè)是使用鎖的機(jī)制來處理線程之間的原子性。依賴于去實(shí)現(xiàn)鎖,因此在這個(gè)關(guān)鍵字作用對(duì)象的作用范圍內(nèi),都是同一時(shí)刻只能有一個(gè)線程對(duì)其進(jìn)行操作的。 線程安全性 定義:當(dāng)多個(gè)線程訪問某個(gè)類時(shí),不管運(yùn)行時(shí)環(huán)境采用何種調(diào)度方式或者這些線程將如何交替執(zhí)行,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)同,這個(gè)類都能表現(xiàn)出正確的行為,那么就稱這個(gè)類是線程安全的。 線程安全性主要體現(xiàn)在三個(gè)方面:原子性、可見性...

    劉玉平 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<