java volatile
程序多线程执行环境:
主内存
线程A + 线程A内存
线程B + 线程B内存
1.没有同步机制的一般情况下,jvm会对变量复制一份
主内存 (normal_var)
线程A + 线程A内存 (normal_var_copy_A)
线程B + 线程B内存 (normal_var_copy_B)
所以可以看到线程A和B是各自操作自己的复制变量,需要的时候才会写入主内存里。
2.使用同步机制volatile关键字,jvm不会复制变量
主内存 (normal_var)
线程A + 线程A内存 (normal_var)
线程B + 线程B内存 (normal_var)
所以可以看到线程A和B是操作主内存里的变量。
但是,变量一定是拥有原子特性的。
private volatile int i;
i++ (读值-修值-写值) 是一串原子的组合,不能保证同步,只可以是同一块内存。
程序多线程执行环境:
主内存
线程A + 线程A内存
线程B + 线程B内存
1.没有同步机制的一般情况下,jvm会对变量复制一份
主内存 (normal_var)
线程A + 线程A内存 (normal_var_copy_A)
线程B + 线程B内存 (normal_var_copy_B)
所以可以看到线程A和B是各自操作自己的复制变量,需要的时候才会写入主内存里。
2.使用同步机制volatile关键字,jvm不会复制变量
主内存 (normal_var)
线程A + 线程A内存 (normal_var)
线程B + 线程B内存 (normal_var)
所以可以看到线程A和B是操作主内存里的变量。
但是,变量一定是拥有原子特性的。
private volatile int i;
i++ (读值-修值-写值) 是一串原子的组合,不能保证同步,只可以是同一块内存。