卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

volatile能否保證線(xiàn)程安全 java里volatile關(guān)鍵字有什么特性是否能保證線(xiàn)程安全?

java里volatile關(guān)鍵字有什么特性是否能保證線(xiàn)程安全?1. Volatile不能保證原子性。簡(jiǎn)而言之,Java有所謂的主存區(qū)和線(xiàn)程棧。在主內(nèi)存區(qū)域和每個(gè)線(xiàn)程的堆棧中都有相同變量的副本(一對(duì)多)

java里volatile關(guān)鍵字有什么特性是否能保證線(xiàn)程安全?

1. Volatile不能保證原子性。簡(jiǎn)而言之,Java有所謂的主存區(qū)和線(xiàn)程棧。在主內(nèi)存區(qū)域和每個(gè)線(xiàn)程的堆棧中都有相同變量的副本(一對(duì)多)。volatile提供的可見(jiàn)性意味著當(dāng)每個(gè)線(xiàn)程訪(fǎng)問(wèn)volatile修改的變量時(shí),volatile確保線(xiàn)程可以從主存加載最新的值(相反,修改線(xiàn)程后同步到主存的值也應(yīng)該對(duì)其他線(xiàn)程可見(jiàn));

2。Java的volatile的語(yǔ)義實(shí)際上并不涉及CPU緩存。JVM本身是一個(gè)軟件抽象,它已經(jīng)在操作系統(tǒng)之上了。由于非原子性,volatile不能保證線(xiàn)程安全。如果只有簡(jiǎn)單的讀寫(xiě)操作,比如set I=2,get I,就可以認(rèn)為是安全的。4Volatile被認(rèn)為比lock更輕,編程更簡(jiǎn)單??梢允褂胿olatile的地方:對(duì)于一個(gè)變量,更新它的值不依賴(lài)于當(dāng)前值,并且該變量不會(huì)與其他變量形成一個(gè)不可變的條件。

多個(gè)線(xiàn)程可以讀一個(gè)變量,只有一個(gè)線(xiàn)程可以對(duì)這個(gè)變量進(jìn)行寫(xiě),到底要不要加鎖?

下面簡(jiǎn)要說(shuō)明以下原因:

鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一?lái)解釋它。看下面兩個(gè)圖。

我這個(gè)操作需要

看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過(guò)程嗎?

鎖定是為了確保上述三個(gè)步驟是原子操作。

回到問(wèn)題上來(lái),只有一個(gè)線(xiàn)程要寫(xiě),沒(méi)有競(jìng)爭(zhēng),所以不需要鎖定。

但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在

在一個(gè)線(xiàn)程寫(xiě)入后,其他線(xiàn)程無(wú)法立即看到它。這就是可見(jiàn)性問(wèn)題。

添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線(xiàn)程可以立即看到它。

volatile關(guān)鍵字在Java中有什么作用?

Volatile是為了防止指令重新排序以確??梢?jiàn)性

對(duì)于JVM級(jí)別,是為了防止編譯器重新排序

同時(shí),對(duì)于某些CPU,它們會(huì)通過(guò)緩存鎖或線(xiàn)程來(lái)解決緩存可見(jiàn)性

但是,目前很多CPU已經(jīng)過(guò)優(yōu)化,由于cache一致性MESI會(huì)帶來(lái)性能開(kāi)銷(xiāo),因此采用storebuffer機(jī)制進(jìn)行異步處理,這種機(jī)制會(huì)導(dǎo)致指令的無(wú)序執(zhí)行。這會(huì)導(dǎo)致可見(jiàn)性問(wèn)題。

那么volatile會(huì)在CPU級(jí)別增加內(nèi)存屏障,解決CPU執(zhí)行無(wú)序?qū)е碌目梢?jiàn)性問(wèn)題

因?yàn)関olatile不能保證它的原子性,它只保證修改后一個(gè)線(xiàn)程對(duì)其他線(xiàn)程可見(jiàn),特別是當(dāng)多線(xiàn)程自動(dòng)增減一個(gè)變量時(shí),會(huì)導(dǎo)致變量錯(cuò)誤。參考《深入理解Java虛擬機(jī)》一書(shū),volatile用于以下場(chǎng)景:

1>操作結(jié)果不依賴(lài)于變量的當(dāng)前值,或者可以確保只有一個(gè)線(xiàn)程修改變量的值。

2>變量不需要與其他狀態(tài)變量一起參與不變約束。因此,在使用volatile關(guān)鍵字時(shí),應(yīng)該小心。不僅僅是簡(jiǎn)單的類(lèi)型變量被volatile修改。此變量上的所有操作都是原始操作。當(dāng)一個(gè)變量的值由它以前的值決定時(shí),例如n=n1,n volatile關(guān)鍵字將無(wú)效。只有當(dāng)一個(gè)變量的值與其前一個(gè)值無(wú)關(guān)時(shí),對(duì)該變量的操作才能是原子級(jí)的,例如n=m1,這是原始級(jí)別。因此,在使用volatile鍵時(shí)必須小心。如果不確定,可以使用synchronized而不是volatile。