并发编程 笔记
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
volatile是一個(gè)類型修飾符(type specifier).volatile的作用是作為指令關(guān)鍵字,確保本條指令不會因編譯器的優(yōu)化而省略,且要求每次直接讀值。volatile是輕量級鎖(無鎖同步),sychonised是重量級鎖,volatile效率遠(yuǎn)高于sychonised。
具體實(shí)現(xiàn):緩存值過期通知。
cpu忙時(shí),直接使用緩存中的內(nèi)容,而在cpu閑的時(shí)候才會去主存中重新讀取數(shù)據(jù)。而加上volatile,則該屬性變更時(shí),將會通知所有使用它的緩存來更新值。
加了volatile,線程之間是可見的。
而不加volatile只能用sychonized,效率低。
?
volatile和sychonised區(qū)別
1.volatile效率遠(yuǎn)高于sychonised
2.volatile不可完全替代sychonised,因?yàn)関olatile只能保證可見性,但是sychonised除了保證可見性,還能保證原子性。
?
Atomic開頭的操作,可以代替簡單的sychonised,效率比synchronized高。
細(xì)粒度的鎖比粗粒度的鎖效率高很多。
sychonized鎖的到底是什么?
sychonised鎖的不是棧內(nèi)存的句柄,而是句柄所指向的堆內(nèi)存中的對象實(shí)體,所以如果我們鎖住了對象o,但之后又對o賦值new Object(),那么o將可以再次被進(jìn)入,因?yàn)榫浔鷒所指向的實(shí)體已經(jīng)不是原來那個(gè)了。
所以o的原來的實(shí)體和新的實(shí)體分別鎖住了兩個(gè)實(shí)體。
同理可以考慮得出字符串常量不能作為鎖,因?yàn)閷τ诔A坎煌木浔梢灾赶蛲粋€(gè)對象,如s1="hello",s2="hello",不同的同步方法可能都需要字符串常量“hello”加鎖,可能導(dǎo)致死鎖。
?
轉(zhuǎn)載于:https://my.oschina.net/u/3786691/blog/1927673
總結(jié)
- 上一篇: linux 查看服务器性能常用命令
- 下一篇: 字节流输入输出代码