volatile的应用
volatile,中文意思是不穩(wěn)定的、反復(fù)無(wú)常的,用來(lái)修飾變量,和多線程、并發(fā)有關(guān)系。
Java代碼在編譯后會(huì)變成Java字節(jié)碼,字節(jié)碼被類加載器加載到JVM里,JVM執(zhí)行字節(jié)碼,最終需要轉(zhuǎn)化為匯編指令在CPU上執(zhí)行。
在多線程并發(fā)編程中 synchronized 和 volatile 都扮演著重要的角色。volatile 是輕量級(jí)的 synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”。可見性的意思是當(dāng)一個(gè)線程修改一個(gè)共享變量時(shí),另外一個(gè)線程能讀到這個(gè)修改的值。如果 volatile 使用恰當(dāng)?shù)脑?#xff0c;它比 synchronized 的使用和執(zhí)行成本更低,因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度。
volatile 是如何來(lái)保證可見性的呢?對(duì) volatile 修飾的共享變量進(jìn)行寫操作時(shí),觀察其匯編指令可發(fā)現(xiàn)有一條Lock前綴的指令。這個(gè)指令在多核處理器下會(huì)引發(fā)兩件事情:
1)將當(dāng)前處理器緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。
2)這個(gè)寫回內(nèi)存的操作會(huì)導(dǎo)致其他處理器的緩存無(wú)效。
為了提高處理速度,處理器不直接和內(nèi)存進(jìn)行通信,而是先將系統(tǒng)內(nèi)存的數(shù)據(jù)讀到內(nèi)部緩存(L1,L2,L3)后再進(jìn)行操作,但操作完之后不知道何時(shí)會(huì)寫到內(nèi)存。如果對(duì) volatile 修飾的變量進(jìn)行寫操作,JVM就會(huì)向處理器發(fā)送一條Lock前綴的指令,將這個(gè)變量所在緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。但是,這個(gè)時(shí)候其他處理器緩存的值還是舊值,再執(zhí)行計(jì)算操作就會(huì)有問(wèn)題。所以,在多核處理器下,為了保證各個(gè)處理器的緩存一致,就會(huì)實(shí)現(xiàn)緩存一致性協(xié)議(MESI協(xié)議),每個(gè)處理器通過(guò)嗅探在總線上傳播的數(shù)據(jù)來(lái)檢查自己緩存的值是不是過(guò)期了,當(dāng)處理器發(fā)現(xiàn)自己緩存行對(duì)應(yīng)的內(nèi)存地址被修改,就會(huì)將當(dāng)前處理器緩存行設(shè)置為無(wú)效狀態(tài),當(dāng)處理器對(duì)這個(gè)數(shù)據(jù)進(jìn)行寫操作時(shí),會(huì)重新從系統(tǒng)內(nèi)存中把數(shù)據(jù)讀到處理器緩存中。
轉(zhuǎn)載于:https://www.cnblogs.com/koushr/p/9302330.html
總結(jié)
以上是生活随笔為你收集整理的volatile的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python异步和多线程_Python
- 下一篇: sql distinct多个字段_数据分