Java学习笔记

Volatile关键字

2017-09-02  本文已影响30人  MPPC

volatile 概念

Java内存模型

Java 内存模型对 volatile 变量定义的特殊规则

/**
 * 测试volatile 关键字的可见性
 */
public class VolatileVisibility implements Runnable{

    private volatile boolean isRunning = true;
    public void setRunning(boolean running) {
        isRunning = running;
    }
    @Override
    public void run() {
        System.out.println("进入了run方法......");
        while (isRunning){
            // 不能在这使用System.out.println方法, 否则isRunning对线程可见
//            System.out.println("等待isRunning 被设置为false!");
        }
        System.out.println("退出了run方法......");
    }
    public static void main(String[] args) throws InterruptedException {
        VolatileVisibility visibility = new VolatileVisibility();
        Thread thread= new Thread(visibility);
        thread.start();
        Thread.sleep(1000);// 让主线程睡1秒
        visibility.setRunning(false);
        System.out.println("isRunning 已经被设置成了false");
    }
}
/**
 * volatile不能保证原子性
 */
public class VolatileNotAtomic {

    private static volatile int count;
    private static void increase(){
        count++;
    }
    private static final int THREAD_COUNT = 20;
    public static void main(String[] args) {
        Thread[] threads = new Thread[THREAD_COUNT];
        for (Thread thread : threads) {
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        increase();
                    }
                }
            });
            thread.start();
        }
        while (Thread.activeCount() > 1){
            Thread.yield();
        }
        System.out.println(count);//输出的结果并不等于200000
    }
}
上一篇下一篇

猜你喜欢

热点阅读