Java SE 基础之Volatile变量初识

来源:互联网 发布:mysql if exists用法 编辑:程序博客网 时间:2024/05/20 06:50

与Synchronized关键字区别:

synchronized是JVM对程序的加锁机制,会使执行线程阻塞;volatile变量则不会,所以说是相对于synchronized而言更轻量的同步机制。

作用

1.volatile修饰的变量可以保证更新操作对其它线程可见;2.当被它修饰后,编译器与运行时都会注意到这个变量是共享的,所以不会将该变量上的操作和其他内存操作一起重排序。禁止指令重排序是第二个语义

注意:

/** * 类描述:volatile保证变量更新可见性,但是不保证是原子性,所以使用的时候仍然需要注意线程安全。 * @author: Wanggd *  时间:2017年5月29日 */public class VolatileTest {    public static volatile int race = 0;    public static void increase(){        //++计算并不是原子的。要想保证线程安全,依然需要借助synchronized或者lock。        race ++;    }    private static final int THREADS_COUNT = 20;    public static void main(String[] args) {        Thread[] threads = new Thread[THREADS_COUNT];        for(int i=0;i<threads.length;i++){            threads[i] = new Thread(new Runnable() {                public void run() {                    for(int i=0;i<10000;i++){                        increase();                    }                }            });            threads[i].start();        }        while(Thread.activeCount() > 1){            Thread.yield();        }        System.out.println(race);        //期望结果为200000        //实际结果往往小于200000;  193582 问题出在++操作。    }}

另一个volatile的案例就是单例模式:
http://blog.csdn.net/kevin_king1992/article/details/72801015

0 0
原创粉丝点击