欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

volatile和原子類的異同點(diǎn)有哪些

這篇文章主要講解了“volatile和原子類的異同點(diǎn)有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“volatile和原子類的異同點(diǎn)有哪些”吧!

湖里網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司

volatile和原子類

我們首先看一個(gè)案例。如圖所示,我們有兩個(gè)線程。

volatile和原子類的異同點(diǎn)有哪些

在圖中左上角可以看出,有一個(gè)公共的 boolean flag 標(biāo)記位,最開(kāi)始賦值為 true。

然后線程 2 會(huì)進(jìn)入一個(gè) while 循環(huán),并且根據(jù)這個(gè) flag 也就是標(biāo)記位的值來(lái)決定是否繼續(xù)執(zhí)行或著退出。

最開(kāi)始由于 flag 的值是 true,所以首先會(huì)在這里執(zhí)行一定時(shí)期的循環(huán)。然后假設(shè)在某一時(shí)刻,線程 1 把這個(gè) flag 的值改為 false  了,它所希望的是,線程 2 看到這個(gè)變化后停止運(yùn)行。

但是這樣做其實(shí)是有風(fēng)險(xiǎn)的,線程 2 可能并不能立刻停下來(lái),也有可能過(guò)一段時(shí)間才會(huì)停止,甚至在最極端的情況下可能永遠(yuǎn)都不會(huì)停止。

為了理解發(fā)生這種情況的原因,我們首先來(lái)看一下 CPU 的內(nèi)存結(jié)構(gòu),這里是一個(gè)雙核的 CPU 的簡(jiǎn)單示意圖:

volatile和原子類的異同點(diǎn)有哪些

可以看出,線程 1 和線程 2 分別在不同的 CPU 核心上運(yùn)行,每一個(gè)核心都有自己的本地內(nèi)存,并且在下方也有它們共享的內(nèi)存。

最開(kāi)始它們都可以讀取到 flag 為 true ,不過(guò)當(dāng)線程 1 這個(gè)值改為 false 之后,線程 2 并不能及時(shí)看到這次修改,因?yàn)榫€程 2  不能直接訪問(wèn)線程 1 的本地內(nèi)存,這樣的問(wèn)題就是一個(gè)非常典型的可見(jiàn)性問(wèn)題。

volatile和原子類的異同點(diǎn)有哪些

要想解決這個(gè)問(wèn)題,我們只需要在變量的前面加上 volatile  關(guān)鍵字修飾,只要我們加上這個(gè)關(guān)鍵字,那么每一次變量被修改的時(shí)候,其他線程對(duì)此都可見(jiàn),這樣一旦線程 1 改變了這個(gè)值,那么線程 2 就可以立刻看到,因此就可以退出  while 循環(huán)了。

volatile和原子類的異同點(diǎn)有哪些

之所以加了關(guān)鍵字之后就就可以讓它擁有可見(jiàn)性,原因在于有了這個(gè)關(guān)鍵字之后,線程 1 的更改會(huì)被 flush 到共享內(nèi)存中,然后又會(huì)被 refresh 到線程  2 的本地內(nèi)存中,這樣線程 2 就能感受到這個(gè)變化了,所以 volatile 這個(gè)關(guān)鍵字最主要是用來(lái)解決可見(jiàn)性問(wèn)題的,可以一定程度上保證線程安全。

現(xiàn)在讓我們回顧一下很熟悉的多線程同時(shí)進(jìn)行 value++ 的場(chǎng)景,如圖所示:

volatile和原子類的異同點(diǎn)有哪些

如果它被初始化為每個(gè)線程都加 1000 次,最終的結(jié)果很可能不是 2000。由于 value++  不是原子的,所以在多線程的情況下,會(huì)出現(xiàn)線程安全問(wèn)題。但是如果我們?cè)谶@里使用 volatile 關(guān)鍵字,能不能解決問(wèn)題呢?

volatile和原子類的異同點(diǎn)有哪些

很遺憾,即便使用了 volatile 也是不能保證線程安全的,因?yàn)檫@里的問(wèn)題不單單是可見(jiàn)性問(wèn)題,還包含原子性問(wèn)題。

我們有多種辦法可以解決這里的問(wèn)題,第 1 種是使用synchronized 關(guān)鍵字,如圖所示:


volatile和原子類的異同點(diǎn)有哪些

這樣一來(lái),兩個(gè)線程就不能同時(shí)去更改 value 的數(shù)值,保證了 value++ 語(yǔ)句的原子性,并且 synchronized  同樣保證了可見(jiàn)性,也就是說(shuō),當(dāng)?shù)?1 個(gè)線程修改了 value 值之后,第 2 個(gè)線程可以立刻看見(jiàn)本次修改的結(jié)果。

解決這個(gè)問(wèn)題的第 2 個(gè)方法,就是使用我們的原子類,如圖所示:

volatile和原子類的異同點(diǎn)有哪些

比如用一個(gè) AtomicInteger,然后每個(gè)線程都調(diào)用它的 incrementAndGet 方法。

在利用了原子變量之后就無(wú)需加鎖,我們可以使用它的 incrementAndGet 方法,這個(gè)操作底層由 CPU  指令保證原子性,所以即便是多個(gè)線程同時(shí)運(yùn)行,也不會(huì)發(fā)生線程安全問(wèn)題。

原子類和 volatile 的使用場(chǎng)景

我們可以看出,volatile 和原子類的使用場(chǎng)景是不一樣的,如果我們有一個(gè)可見(jiàn)性問(wèn)題,那么可以使用  volatile 關(guān)鍵字,但如果我們的問(wèn)題是一個(gè)組合操作,需要用同步來(lái)解決原子性問(wèn)題的話,那么可以使用原子變量,而不能使用 volatile 關(guān)鍵字。

通常情況下,volatile 可以用來(lái)修飾 boolean 類型的標(biāo)記位,因?yàn)閷?duì)于標(biāo)記位來(lái)講,直接的賦值操作本身就是具備原子性的,再加上 volatile  保證了可見(jiàn)性,那么就是線程安全的了。

感謝各位的閱讀,以上就是“volatile和原子類的異同點(diǎn)有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)volatile和原子類的異同點(diǎn)有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

名稱欄目:volatile和原子類的異同點(diǎn)有哪些
文章出自:http://chinadenli.net/article22/jpspjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃服務(wù)器托管定制網(wǎng)站企業(yè)網(wǎng)站制作Google企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)