敦化網(wǎng)站建設(shè)哈爾濱最新今日頭條新聞
并發(fā)與并行的概念:
并發(fā):一段時間內(nèi)(假設(shè)只有一個CPU)執(zhí)行多個線程,多個線程時按順序執(zhí)行
并行:同個時間點上,多個線程同時執(zhí)行(多個CPU)
什么是并發(fā)編程?
在現(xiàn)代互聯(lián)網(wǎng)的應(yīng)用中,會出現(xiàn)多個請求同時對共享資源的訪問情況,例如在買票,秒殺與搶購的場景中
此時就會出現(xiàn)線程安全的問題,并發(fā)編程就是通過編程控制多個線程依次執(zhí)行防止線程安全的問題出現(xiàn)
并發(fā)問題產(chǎn)生的根本原因
多核CPU的處理
基于java的內(nèi)存模型
JMM
JMM全稱Java Memory Model表示Java內(nèi)存模型,是java虛擬機(jī)中所進(jìn)行規(guī)范的
java內(nèi)存模型中規(guī)定所有的變量都存儲在工作內(nèi)存中,所有的線程共享工作內(nèi)存中的變量
每個線程都會有自己私有的工作內(nèi)存,線程會將工作內(nèi)存中的共享變量讀取到工作內(nèi)存中作為緩存
?
并發(fā)編程解決的核心問題
可見性
可見性指的是線程在對共享變量進(jìn)行修改之后,其他線程時能夠立即知道
現(xiàn)在的多核CPU的處理中單個線程對共享變量進(jìn)行修改后,其他的線程是不可見的
有序性
有序性是指的代碼運行的順序是按照的編寫的順序運行的
在代碼編譯運行的過程中,CPU為了提高性能,可能會打亂代碼原來的編寫順序,比如需要讀取一個讀取時間較長的變量時,可能會跳過它去讀取速度較快的變量
這是由于CPU的讀等待機(jī)制造成的,CPU在讀取一個讀時間長的變量時會去同時讀取其他的變量
原子性
原子性指的是操作的原子性,在多個指令操作同時進(jìn)行時應(yīng)該保證這多條命令的一致性執(zhí)行
比如說"i++"這個操作是在高級語言中是一條編程指令,但實際上在CPU執(zhí)行的時候可以拆分為三條CPU的執(zhí)行指令,分別是從主內(nèi)存中讀取變量i的值,在工作內(nèi)存中對變量的值進(jìn)行操作,然后在對主內(nèi)存中的值進(jìn)行更新
如果此時多核的CPU支持線程切換的調(diào)度,則會導(dǎo)致"i++"這一條命令還沒有執(zhí)行完成就進(jìn)行了線程的切換,導(dǎo)致出現(xiàn)的線程安全問題
?
小結(jié)
可見性的問題是由緩存導(dǎo)致的,有序性的問題是由編譯導(dǎo)致的,原子性的問題是由線程切換導(dǎo)致的
三個問題出發(fā)點都是的為了的提高程序的性能,這與并發(fā)程序編寫的目的是一致的