笔记:认识volatile

认识volatile

  • volatile是什么
  • volatile可以解决什么问题
  • 什么是线程不可见问题
    • 为什么会有这样的问题
  • 什么是指令重排序问题

volatile是什么

volatile是Java的一个关键字,可以用来修饰成员变量静态变量

public class VolatileTest{
	//修饰成员变量
	private volatile boolean flag = false;
	
	//修饰静态变量
	private volatile static int count = 0;
}

volatile可以解决什么问题

volatile主要解决了线程不可见问题指令重排序问题

什么是线程不可见问题

线程不可见问题是指同进程的线程之间变量不同步现象(参考下面的演示代码)

public class VolatileTest{
	private static boolean flag = true; //定义一个静态变量
	
	public static void main(String[] args) throws InterruptedException{
			
		new Thread(() -> {
			System.out.println("server start---");
			while(flag){
				//do something
			}
			System.out.println("server stop---");
		},"server").start(); //创建一个线程并启动
		
		Thread.sleep(1000); //main线程睡眠1s
		
		flag = false; //修改静态变量的值
	}
}

为什么会有这样的问题

什么是指令重排序问题

指令重排序问题是指在多线程情况下由于指令重排序导致程序并不按预期执行的线程(参考下面的演示代码)

public class VolatileTest{
	private static int a, b, c, d; //定义四个静态变量
	
	private static void test(){
		//创建并启动一个线程
		new Thread(() -> {
			a = 1; 
			c = b;
		}).start();
		
		//创建并启动一个线程
		new Thread(() -> {
			b = 1;
			d = a;
		}).start();
		
		//如果当前还存活2个以上的线程,则main线程重新进入就绪状态
		//IDEA会默认启动一个Monitor线程
		while(Thread.activeCount() > 2){
			Thread.yield();
		}
	}
	
	public static void main(String[] args){
		for(int i=0; ;i++,a=0,b=0,c=0,d=0){
			test();
			//当c=0并且d=0的时候打印执行的次数,并终止循环
			if(c==0 && d==0){
				System.out.println("times: "+i);
				break;
			}
		}
	}
}

你可能感兴趣的:(java)