用volatile修飾的變量,其他線程在每次使用這個變量的時候,都會讀取變量修改后的最的值。volatile變量每次修改后都會把值從線程本地內存刷新到主內存,讀取也一樣,每次都從主內存中讀取。
用volatile修改的變量,如果自增減的操作,并不能保證原子性。
package cn.true123;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class VolatileTest {
private volatile int count = 0;
public void increase() {
count++;
}
CountDownLatch countDownLatch = new CountDownLatch(100);
class Increase implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100000; i++)
increase();
countDownLatch.countDown();
}
}
public int getCount(){
return count;
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
VolatileTest volatileTest = new VolatileTest();
for (int i = 0; i < 100; i++) {
Runnable runnable = volatileTest.new Increase();
executorService.execute(runnable);
}
try {
volatileTest.countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=="+volatileTest.getCount());
}
}
執行結果:
==9999615
可見volatile變量,能保證對線程可見性,不能保證原子性。