加鎖能夠保證可見性與原子性;volatile變量只能保證可見性。
spring只有知足了下面全部的標準後,你才能使用volatile變量:併發
寫入變量時並不依賴變量的當前值;或者可以確保只有單一的線程修改變量的值;框架
變量不須要與其它的狀態變量共同參與不變約束;spa
並且,訪問變量時,沒有其餘緣由須要加鎖。線程
volatile變量當然方便,但也有限制。它們一般被看成標識完成、中斷、狀態的標記使用(能夠看一些框架如spring,netty等併發中的狀態)。儘管volatile變量也能夠用來表示其餘類型的狀態信息,可是決定這樣作以前請格外當心。好比,volatile的語義不足以使自增操做(++)原子化,除非你能保證只有一個線程對變量執行寫操做。(原子變量提供了」讀-寫-改「原子操做的支持,並且常被用做」更優秀的volatile變量「。)
netty