用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变量,能保证对线程可见性,不能保证原子性。