探究Java如何实现原子操作(atomic operation)
生活随笔
收集整理的這篇文章主要介紹了
探究Java如何实现原子操作(atomic operation)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 讓我們首先了解下java 中 Volatile 關(guān)鍵字
? ? ?Volatile可實(shí)現(xiàn)java內(nèi)存模型當(dāng)中的可見(jiàn)性,
? ? ?java內(nèi)存模型的可見(jiàn)性:
可見(jiàn)性,是指線程之間的可見(jiàn)性,一個(gè)線程修改的狀態(tài)對(duì)另一個(gè)線程是可見(jiàn)的。也就是一個(gè)線程修改的結(jié)果,另一個(gè)線程馬上就能看到。
比如:用volatile修飾的變量,就會(huì)具有可見(jiàn)性。volatile修飾的變量不允許線程內(nèi)部緩存和重排序,即直接修改內(nèi)存。所以對(duì)其他線程是可見(jiàn)的。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?BUT
Volatile 不保證原子性:
?just like this:
? volatile int a=0; a 具有可見(jiàn)性 但是如下操作仍然不具有原子性 a++;
讓我們看看什么是原子操作 什么是非原子操作:
原子操作:a=0;
非原子操作 a++,即a=a+1;
那么在java 中 如何保證原子性呢?方法是 sync ,lock,unlock
2 .那么volatile的實(shí)現(xiàn)原理是什么?
? ? 先這樣理解:
? ? ?把對(duì)volatile變量的單個(gè)讀/寫(xiě),看成是使用同一個(gè)鎖對(duì)這些單個(gè)讀/寫(xiě)操作 ? ? 做了同步。示例:
? ? ? ? ? ? ?
示例程序下面的程序等價(jià)于上面的示例程序
?
等價(jià)程序volatile的特性:
? (1) 對(duì)一個(gè)volatile變量的單個(gè)讀/寫(xiě)操作,與對(duì)一個(gè)普通變量的讀/寫(xiě)操作使用同一個(gè)鎖來(lái)同步,它們之間的執(zhí)行效果相同。
可見(jiàn)性:對(duì)一個(gè)volatile變量的讀,總是能看到(任意線程)對(duì)這個(gè)volatile變量最后的寫(xiě)入。
原子性:對(duì)任意單個(gè)volatile變量的讀/寫(xiě)具有原子性,但類似于volatile++這種復(fù)合操作不具有原子性。
3:來(lái)談?wù)?------鎖
? ? ? 3.1:釋放鎖和獲取鎖的內(nèi)存語(yǔ)義
? 當(dāng)線程釋放鎖時(shí),JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中,示例代碼如下:
?
code假設(shè)線程A執(zhí)行writer()方法,隨后線程B執(zhí)行reader()方法。
整個(gè)的執(zhí)行過(guò)程如下:threadA(1->2->3)->threadB(4->5->6)
根據(jù)happen-before原則:3執(zhí)行前的所有A線程的操作在3執(zhí)行成功后對(duì)4以后的流程立即可見(jiàn)
鎖釋放和鎖獲取的內(nèi)存意義:當(dāng)線程釋放鎖時(shí),JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的變量刷新到主內(nèi)存中。
當(dāng)線程獲取共享變量時(shí),會(huì)把本地內(nèi)存中的變量設(shè)置為無(wú)效,
從而使得被監(jiān)控的臨界區(qū)中的代碼必須去主內(nèi)存中去讀取共享變量。
4:那就來(lái)看看 atomic operation,原子操作不需要sync:
作者:銅雀春深鎖不住
鏈接:https://www.jianshu.com/p/5195f7f742a8
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
轉(zhuǎn)載于:https://www.cnblogs.com/lukelook/p/11252715.html
總結(jié)
以上是生活随笔為你收集整理的探究Java如何实现原子操作(atomic operation)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle的oradata,Oracl
- 下一篇: Java基础知识总结(一)创建和销毁对象