併發編程 筆記

volatile是一個類型修飾符(type specifier).volatile的做用是做爲指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。volatile是輕量級鎖(無鎖同步),sychonised是重量級鎖,volatile效率遠高於sychonised。緩存

具體實現:緩存值過時通知。優化

cpu忙時,直接使用緩存中的內容,而在cpu閒的時候纔會去主存中從新讀取數據。而加上volatile,則該屬性變動時,將會通知全部使用它的緩存來更新值。spa

加了volatile,線程之間是可見的。線程

而不加volatile只能用sychonized,效率低。對象

 

volatile和sychonised區別內存

1.volatile效率遠高於sychonisedci

2.volatile不可徹底替代sychonised,由於volatile只能保證可見性,可是sychonised除了保證可見性,還能保證原子性。字符串

 

Atomic開頭的操做,能夠代替簡單的sychonised,效率比synchronized高。編譯器

細粒度的鎖比粗粒度的鎖效率高不少。同步

sychonized鎖的究竟是什麼?

sychonised鎖的不是棧內存的句柄,而是句柄所指向的堆內存中的對象實體,因此若是咱們鎖住了對象o,但以後又對o賦值new Object(),那麼o將能夠再次被進入,由於句柄o所指向的實體已經不是原來那個了。

因此o的原來的實體和新的實體分別鎖住了兩個實體。

同理能夠考慮得出字符串常量不能做爲鎖,由於對於常量不一樣的句柄能夠指向同一個對象,如s1="hello",s2="hello",不一樣的同步方法可能都須要字符串常量「hello」加鎖,可能致使死鎖。

相關文章
相關標籤/搜索