日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java 并發(fā)編程的可見性、有序性和原子性

瀏覽:38日期:2022-08-21 09:00:59

并發(fā)編程無論在哪門語言里,都屬于高級(jí)篇,面試中也嘗嘗會(huì)被問到。想要深入理解并發(fā)編程機(jī)制確實(shí)不是一件容易的事,因?yàn)樗婕暗接?jì)算機(jī)底層和操作系統(tǒng)的相關(guān)知識(shí),如果對(duì)這部分知識(shí)不是很清楚可能會(huì)導(dǎo)致理解困難。

在這個(gè)專欄里,王子會(huì)盡量以白話和圖片的方式剖析并發(fā)編程本質(zhì),希望可以讓大家更容易理解。

今天我們就來談一談可見性、有序性和原子性都是什么東西。

并發(fā)編程的幕后

進(jìn)入主題之前,我們先來了解一下并發(fā)編程的幕后。

隨著CPU、內(nèi)存和I/O設(shè)備的不斷升級(jí),它們之間一直存在著一個(gè)矛盾,就是速度不一致問題。CPU的速度高于內(nèi)存,內(nèi)存的速度又高于I/O設(shè)備。

我們寫的代碼中大多數(shù)內(nèi)容都會(huì)經(jīng)過內(nèi)存處理,有些內(nèi)容會(huì)去讀寫I/O設(shè)備,根據(jù)木桶理論,整體的性能取決于最慢的操作,就是I/O設(shè)備,所以單單提升CPU的性能是不夠的。

為了最大化體現(xiàn)出CPU的性能,計(jì)算機(jī)底層主要做了三部分優(yōu)化:

1.CPU增加了緩存,比內(nèi)存速度更快,平衡內(nèi)存的速度

2.操作系統(tǒng)增加了進(jìn)程和線程,可以對(duì)CPU分時(shí)復(fù)用

3.編譯程序會(huì)進(jìn)行指令的重排,使緩存更好的發(fā)揮性能

我們平時(shí)的工作中其實(shí)一直都享受著這些優(yōu)化后的成果,但同時(shí)他們也會(huì)導(dǎo)致一些很難找到原因的BUG。

什么是可見性

首先我們就來看看什么是可見性。

一個(gè)線程對(duì)共享變量的修改,另一個(gè)線程可以感知到,我們稱其為可見性。

在單核時(shí)代,其實(shí)是不存在可見性問題的,因?yàn)樗械木€程都是在一個(gè)CPU中工作的,一個(gè)線程的寫操作對(duì)于其他的線程一定是可見的。

Java 并發(fā)編程的可見性、有序性和原子性

但是多核CPU出現(xiàn)后,每個(gè)CPU都有自己的緩存,多個(gè)線程在不同的CPU中處理數(shù)據(jù)就會(huì)導(dǎo)致不可見問題。

Java 并發(fā)編程的可見性、有序性和原子性

假設(shè)變量v的值是1, 兩個(gè)線程同時(shí)執(zhí)行了v++操作,首先會(huì)從內(nèi)存中讀取變量v的數(shù)據(jù)到各自的CPU緩存中,這個(gè)時(shí)候兩個(gè)CPU緩存中的v都是1,執(zhí)行v++后,兩個(gè)變量v都變成了2,然后再寫回內(nèi)存,內(nèi)存中的變量v就變成了2。

但其實(shí)我們想看到的結(jié)果v最終應(yīng)該是3才對(duì)。

在CPU1緩存中執(zhí)行v++后,CPU2緩存無法感知的到,這就是可見性問題。而由于可見性問題導(dǎo)致的最終數(shù)據(jù)不正確,就是線程安全問題。

什么是原子性

由于I/O的速度太慢,早期的操作系統(tǒng)發(fā)明了多進(jìn)程,就是允許某個(gè)進(jìn)程執(zhí)行一小段時(shí)間后,重新選擇一個(gè)進(jìn)程來執(zhí)行,這個(gè)過程叫做任務(wù)切換,而這一小段的時(shí)間我們稱其為時(shí)間片。

Java 并發(fā)編程的可見性、有序性和原子性

現(xiàn)在操作系統(tǒng)的任務(wù)切換一般指的是更輕量級(jí)的線程切換,java的并發(fā)編程是基于多線程的,自然也會(huì)存在線程切換。

一般會(huì)在時(shí)間片結(jié)束的時(shí)候進(jìn)行線程切換,java語言中執(zhí)行的一段簡單的代碼往往需要多條CPU的指令實(shí)現(xiàn),比如count++這部分代碼,至少需要三條CPU指令:

1.首先把count從內(nèi)存中讀取到CPU的寄存器中

2.在寄存器中執(zhí)行+1操作

3.最后將count的值寫入內(nèi)存中(可能寫入到CPU的緩存中)

而線程切換是可以發(fā)生在任意的一條CPU指令執(zhí)行之后的,注意,這里說的是CPU的指令,而不是java語言中的指令,對(duì)于上面的三條指令來說,我們假設(shè) count=0,如果線程 A 在指令 1 執(zhí)行完后做線程切換,線程 A 和線程 B 按照下圖的順序執(zhí)行,那么我們會(huì)發(fā)現(xiàn)兩個(gè)線程都執(zhí)行了 count++ 的操作,但是得到的結(jié)果不是我們期望的 2,而是 1。

Java 并發(fā)編程的可見性、有序性和原子性

這就是線程切換導(dǎo)致的數(shù)據(jù)錯(cuò)誤問題,我們把一個(gè)或者多個(gè)操作在 CPU 執(zhí)行的過程中不被中斷的特性稱為原子性,CPU 能保證的原子操作是 CPU 指令級(jí)別的,而不是高級(jí)語言的操作符,這是違背我們直覺的地方。因此,很多時(shí)候我們需要在高級(jí)語言層面保證操作的原子性。

什么是有序性

有序性指的是程序按照代碼的先后順序執(zhí)行。編譯器為了優(yōu)化性能,有時(shí)候會(huì)改變程序中語句的先后順序,例如程序中:“x=1;y=2;”編譯器優(yōu)化后可能變成“y=2;x=1;”。

在這個(gè)例子中,編譯器調(diào)整了語句的順序,但是不影響程序的最終結(jié)果。不過有時(shí)候調(diào)整了語句的順序可能導(dǎo)致意想不到的 Bug。

在 Java 領(lǐng)域一個(gè)經(jīng)典的案例就是利用雙重檢查創(chuàng)建單例對(duì)象,代碼如下:

public class Singleton { static Singleton instance; static Singleton getInstance(){ if (instance == null) { synchronized(Singleton.class) { if (instance == null) instance = new Singleton(); } } return instance; }}

假設(shè)有兩個(gè)線程 A、B 同時(shí)調(diào)用 getInstance() 方法,他們會(huì)同時(shí)發(fā)現(xiàn) instance == null ,于是同時(shí)對(duì) Singleton.class 加鎖,此時(shí) JVM 保證只有一個(gè)線程能夠加鎖成功(假設(shè)是線程 A),另外一個(gè)線程則會(huì)處于等待狀態(tài)(假設(shè)是線程 B);線程 A 會(huì)創(chuàng)建一個(gè) Singleton 實(shí)例,之后釋放鎖,鎖釋放后,線程 B 被喚醒,線程 B 再次嘗試加鎖,此時(shí)是可以加鎖成功的,加鎖成功后,線程 B 檢查 instance == null 時(shí)會(huì)發(fā)現(xiàn),已經(jīng)創(chuàng)建過 Singleton 實(shí)例了,所以線程 B 不會(huì)再創(chuàng)建一個(gè) Singleton 實(shí)例。

這個(gè)過程看上去是不是無懈可擊,沒有漏洞?

答案是否定的,問題就出在了new操作上,我們以為的new操作是這樣的:

1.分配一塊內(nèi)存空間

2.在這塊內(nèi)存空間上初始化Singleton實(shí)例對(duì)象

3.把這個(gè)對(duì)象的內(nèi)存地址賦值給instance變量

但實(shí)際上由于指令重排,優(yōu)化后的過程是這樣的:

1.分配一塊內(nèi)存空間

2.把這快內(nèi)存空間的內(nèi)存地址賦值給instance變量

3.在這塊內(nèi)存空間上初始化Singleton實(shí)例對(duì)象

那么這樣調(diào)換順序后會(huì)發(fā)生什么呢?

我們假設(shè)線程 A 先執(zhí)行 getInstance() 方法,當(dāng)執(zhí)行完指令 2 時(shí)恰好發(fā)生了線程切換,切換到了線程 B 上;如果此時(shí)線程 B 也執(zhí)行 getInstance() 方法,那么線程 B 在執(zhí)行第一個(gè)判斷時(shí)會(huì)發(fā)現(xiàn) instance != null ,所以直接返回 instance,而此時(shí)的 instance 是沒有初始化過的,如果我們這個(gè)時(shí)候訪問 instance 的成員變量就可能觸發(fā)空指針異常。

總結(jié)

使用并發(fā)編程開發(fā),往往會(huì)出現(xiàn)很多難以找到原因的BUG,通過對(duì)可見性、有序性和原子性的分析,可以為我們排查并發(fā)導(dǎo)致的BUG提供一些思路。

CPU緩存會(huì)導(dǎo)致可見性

指令重排會(huì)導(dǎo)致有序性

線程切換會(huì)導(dǎo)致原子性

以上就是本篇文章的三個(gè)核心內(nèi)容,那我們下篇文章繼續(xù)。

以上就是Java 并發(fā)編程的可見性、有序性和原子性的詳細(xì)內(nèi)容,更多關(guān)于Java 并發(fā)編程的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本少妇一区| 日韩精品第一区| 精品欧美久久| av在线日韩| 欧美综合另类| 亚洲少妇在线| 免费久久99精品国产自在现线| 欧美日韩国产探花| 久久精品影视| 极品日韩av| 欧美日韩四区| 美美哒免费高清在线观看视频一区二区| 亚洲免费影视| 亚洲欧美久久精品| 日韩av中文字幕一区二区 | 国产成人精品一区二区三区在线| 麻豆91精品91久久久的内涵| 97欧美在线视频| 亚洲国内精品| 水野朝阳av一区二区三区| 亚洲精品麻豆| 精品亚洲免a| 岛国av在线播放| 久久中文亚洲字幕| 亚洲深夜福利在线观看| 日韩精品电影一区亚洲| 国产三级一区| 日韩不卡一区| 欧美特黄一区| 日本成人在线视频网站| 欧美aⅴ一区二区三区视频| 国产自产自拍视频在线观看| 国产综合色产| 亚洲精品精选| 国产在线观看91一区二区三区| 999久久久免费精品国产| 日韩制服丝袜先锋影音| 日韩高清不卡在线| 日韩成人免费| 中文字幕成人| 国产成人精品一区二区免费看京| 欧美精品一二| 国产精品免费大片| 国产综合婷婷| 国产乱人伦精品一区| 四虎884aa成人精品最新| 视频在线在亚洲| 国产成人精品一区二区三区视频| 亚洲一区国产| 麻豆国产精品一区二区三区| 蜜桃tv一区二区三区| 欧美中文一区| 欧美男人天堂| 日韩动漫一区| 99久久婷婷| 国产精品成人一区二区网站软件| 免费观看久久av| 国产精品美女午夜爽爽| 偷拍欧美精品| 免费看一区二区三区| 999在线观看精品免费不卡网站| 国产免费播放一区二区| 亚洲精品国产偷自在线观看| 国产精品99久久免费| 9国产精品视频| 国产一区调教| 日本成人在线不卡视频| 久久久久国产精品一区二区| 日本不卡视频一二三区| 欧美一级精品| 国产精品久久久久77777丨| 悠悠资源网久久精品| 国产一区二区三区天码| 亚洲免费观看高清完整版在线观| 秋霞国产精品| 国产欧美日韩一区二区三区四区 | 一二三区精品| 国产精品亚洲一区二区三区在线观看| 日本一区免费网站| 亚洲午夜久久久久久尤物| 国产亚洲观看| 免费在线成人网| 久久中文字幕二区| 国产剧情一区| 亚洲精品无吗| 午夜精品免费| 成人免费网站www网站高清| 麻豆久久久久久| 911精品国产| 综合激情在线| 99pao成人国产永久免费视频| 久久视频一区| av在线最新| 精品国产成人| 久久av中文| 综合视频一区| 丝袜亚洲精品中文字幕一区| 欧美69视频| 精品日韩视频| 天堂√8在线中文| 超级白嫩亚洲国产第一| 精品三区视频| 国产精品伦一区二区| 91精品视频一区二区| 香蕉精品999视频一区二区| 久久亚洲国产| 日韩精品午夜| 秋霞国产精品| 久久久亚洲一区| 日韩欧美一区二区三区免费观看| 卡一卡二国产精品| 国产精品美女在线观看直播| 国产区精品区| 国产欧美日韩精品高清二区综合区| 日韩精品三级| 日本免费在线视频不卡一不卡二| 日韩黄色免费网站| 日韩国产在线一| 天堂精品久久久久| 日韩国产91| 国产精品一区二区99| 国产精品白浆| 精品九九久久| 亚洲成人不卡| 99在线精品免费视频九九视| 亚洲一区二区三区四区五区午夜| 亚洲在线观看| 亚洲精品无播放器在线播放| 婷婷精品在线| 国产精品久久乐| 欧美国产另类| 精品国产第一福利网站| 私拍精品福利视频在线一区| 亚洲国产综合在线看不卡| 日韩午夜av在线| 亚洲69av| 国产亚洲观看| 91视频一区| 国产高清一区二区| 喷白浆一区二区| 日韩一区二区三区免费视频| 天堂va在线高清一区| 91成人精品在线| 九九99久久精品在免费线bt| 麻豆91小视频| 国产麻豆久久| 久久亚洲视频| 久久国产乱子精品免费女| 欧美国产亚洲精品| 成年男女免费视频网站不卡| 国产精品99一区二区| 人人爽香蕉精品| 国产精品久久久久久妇女| 色偷偷偷在线视频播放| 亚洲在线国产日韩欧美| 91亚洲无吗| 高清av一区| 亚洲激情精品| 久久国内精品视频| 欧美日韩免费看片| 亚洲欧美日韩精品一区二区 | 亚洲专区在线| 国产精品**亚洲精品| 肉色欧美久久久久久久免费看| 一级欧洲+日本+国产| 亚洲tv在线| 国产精选在线| 亚洲一级大片| 欧美国产美女| 亚洲欧美日韩在线观看a三区 | 国产三级一区| 99精品视频精品精品视频| 亚洲影院天堂中文av色| 欧美成a人片免费观看久久五月天| 亚洲www啪成人一区二区| 在线看片日韩| 精品亚洲二区| 久久最新视频| 欧美国产偷国产精品三区| 视频在线在亚洲| 久久久久久自在自线| 亚洲精品成人一区| 精品日韩视频| 婷婷综合国产| 欧美肉体xxxx裸体137大胆| 日韩精品a在线观看91| 日韩综合精品| 久久国产人妖系列| 在线亚洲免费| 成人午夜网址| 日本在线成人| 在线精品视频在线观看高清| 麻豆国产精品视频| 蜜臀久久99精品久久久久久9| 日韩av在线播放网址| 四虎精品永久免费| 91精品精品| 精品国产一区二区三区噜噜噜| 欧美精品一二| 麻豆国产在线|