Volatile:
當把變量聲明為volatile類型后,編譯器和運行時都會注意到這個變量是共享的,因此不會將該變量上的操作與其它內存操作一起重排序。volatile變量不會被緩存在寄存器或者對其他處理器不可見的地方,因此在讀取volatile類型變量時總會返回最新的值。
也就是說volatile類型的變量保證了可見性 但是不能保證原子性 在進行自增等非原子性操作的時候依然會出現並發問題。
Volatile和鎖:
當多個線程同時請求鎖的時候,一些線程將被掛起並且等待其他線程執行完它們的時間片后才能被調度執行。頻繁的線程間上下文切換及線程調度是十分耗資源的。另外鎖還存在着死鎖的風險。
與鎖相比,volatile是一種更加輕量級的同步機制,因為在使用這些變量的時候不會發生上下文切換和線程調度等操作。但是volatile同樣也存在局限性:當變量依賴於其他變量或舊值時(自增)就不能使用volatile變量,
因為他們不是原子操作。