Java并发机制深究1-synchronized和volatile
?在多線程并發(fā)編程中,synchronized和volatile都是很重要的,volatile是輕量級(jí)的synchronized。在多處理器編程中保證共享變量的統(tǒng)一性。
1.volatile的使用和原理
如果一個(gè)變量被聲明為volatile,java線程內(nèi)存模型確保所有線程中得到變量的值是一致的。
在對(duì)volatile修飾的變量進(jìn)行賦值操作時(shí)會(huì)引發(fā)兩個(gè)操作:
<1> 把當(dāng)前處理器緩沖行中的數(shù)據(jù)寫入內(nèi)存;
<2> 寫回內(nèi)存的操作會(huì)使其他cpu中緩存的數(shù)據(jù)無效。
2.synchronized的原理
Java中的每一個(gè)對(duì)象都可以作為鎖,具體表現(xiàn)為:
<1> 對(duì)于普通同步方法,鎖是當(dāng)前實(shí)例對(duì)象;
<2> 對(duì)于靜態(tài)同步方法,鎖是當(dāng)前class對(duì)象;
<3> 對(duì)于同步代碼塊,鎖是synchronized括號(hào)里配置的對(duì)象;
從jvm規(guī)范中可以看出synchronized的實(shí)現(xiàn)原理,jvm是根據(jù)monitor對(duì)象來實(shí)現(xiàn)的。代碼塊同步是根據(jù)monitorenter和monitorexit指令實(shí)現(xiàn)的。
monitorenter指令在編譯后插入到同步代碼塊的開始位置,而monitorexit是插入到代碼塊的結(jié)束和異常處,jvm要保證monitorenter和monitorexit進(jìn)行配對(duì)。當(dāng)線程執(zhí)行到monitorenter指令時(shí),獲取對(duì)象所對(duì)應(yīng)的monitor的所有權(quán),獲得對(duì)象的鎖,此時(shí)其他線程訪問此對(duì)象就處于阻塞狀態(tài)。當(dāng)執(zhí)行到monitorexit時(shí),線程會(huì)釋放掉鎖。
轉(zhuǎn)載于:https://www.cnblogs.com/wuyuetian/p/5498937.html
總結(jié)
以上是生活随笔為你收集整理的Java并发机制深究1-synchronized和volatile的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BYS推荐MS前端PhoneCall面试
- 下一篇: Unity3D 之NGUI各种脚本及应用