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

彻底弄明白之java多线程中的volatile

2016-04-27 23:51 489 查看
转载:http://www.cnblogs.com/yakun/p/3589437.html

一. volatite 简述

Java 语言提供了一种稍弱的同步机制,即 volatile

变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新.

当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.

二. volatite 线程安全?

volatile 变量对所有线程是立即可见的,对 volatile 变量所有的写操作都能立即反应到 其他线程之中,换句话说:volatile

变量在各个线程中是一致的,所以基于 volatile 变量的运算是线程安全的. 这句话论据貌似没有错,论点确实错的.

三. volatite 为什么是线程不安全的?

public class VolatileTest{

public static volatile int  i;

public static void increase(){
i++;
}
}


javap -c -l VolatileTest.class

public class VolatileTest {
public static volatile int i;

public VolatileTest();
Code:
0: aload_0
1: invokespecial #1                  // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0

public static void increase();
Code:
0: getstatic     #2                  // Field i:I, 把i的值取到了操作栈顶,volatile保证了i值此时是正确的.
3: iconst_1
4: iadd                              // increase,但其他线程此时可能已经把i值加大了好多
5: putstatic     #2                  // Field i:I ,把这个已经out of date的i值同步回主内存中,i值被破坏了.
8: return
LineNumberTable:
line 6: 0
line 7: 8
}


从这个角度说 volatile 并不完全是线程安全的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: