1.volatile 作用
volatile用于修饰java的变量,不能保证原子性,所以当多个线程去更新的时候,最终结果不准确
1.可见性
一个线程变量的修改对另外的线程是可见的,每个线程都有属于自己的栈,volatile修饰的变量 需要使用,直接去主内存中获取最新的值放到栈中,更改后,会同步到主内存中去
package com.pgf.juc.volatileT;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Auther: pgf
* @Date: 2020/3/4 0004
* @Description: 轻量级同步手段,原子可见性
* @ToDo:
* @version: 1.0
*/
public class VolatileTest implements Runnable{
private static volatile boolean flag = true;
/*一个线程一直循环,除非检测到flag变为false*/
@Override
public void run() {
while(flag){
}
System.out.println(Thread.currentThread().getName()+"===flag is:"+flag);
}
public static void main(String[] args) throws InterruptedException {
new Thread(new VolatileTest()).start();
Thread.sleep(100);
flag = false;
System.out.println(Thread.currentThread().getName()+"===flag is:"+flag);
}
}
2.防止指令重排序
User user = new User()
1.分配对象的内存空间
2.初始化对象
3.设置引用指向分配的内存地址
其中2、3两步间会发生指令重排序,导致多线程时如果在初始化之前访问对象则会出现问题,单例模式的双重检测锁模式正是会存在这个问题。可以使用volatile来禁止指令重排序解决问题