您的位置:首页 > 编程语言 > Java开发

Java SE基础之Volatile变量初识

2017-04-19 10:54 169 查看
与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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息