jdk5提供了java.util.concurrent包,這個包並行功能強大,工具齊全,其中就包括原子變量atomicjava
那麼咱們先說說volatile,volatile能夠保證內存的可見性,禁用重排序,可是不能保證操做的原子性,不具有互斥性,那麼,何時能夠用volatile呢?必須同時知足如下三條:算法
只解釋一下第一條,「不依賴本身的當前值」,舉個簡單的例子:count++, 這個就叫依賴當前值。爲何要有這樣的限制?由於,volatile不保證count++是原子的,即咱們所說的「互斥執行」,雖然咱們過去的例子都把一條代碼看成一個動做,但相信你知道,一條代碼在CPU那裏多半不會是一條指令,好比count++其實會分解爲load-modify-store三個更小的動做,若是這樣的操做有多個線程在作,是極易出錯的。工具
原子變量的特色在於其原子性的CAS(compare-and-swap)操做,由此能夠完成volatile所不能的「check-and-act」動做,同時它能夠保證內存的可見性,「可見性」只不過是其稍帶腳支持的功能而已。atom
Java.util.concurrent中實現的原子操做類包括:AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。另外其底層就是volatile和CAS 共同做用的結果:spa
1.首先使用了volatile 保證了內存可見性。線程
2.而後使用了CAS(compare-and-swap)算法 保證了原子性。排序
其中CAS算法的原理就是裏面包含三個值:內存值A 預估值V 更新值 B 當且僅當 V == A 時,V = B; 不然,不會執行任何操做。內存
synchronized鎖不單單有「互斥」的功能,將多步操做加鎖保證了原子操做,並且還保證了內存可見性。變量