并发编程之 - Volatile线程可见性:保证了线程间共享变量的及时可见性

什么Volatile

Volatile 保证了线程间共享变量的及时可见性,但不能保证原子性。

可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。

在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。

案例:

案例说明:创建一个线程启动while(flag)循环,等3m过后,设置flag值为false,但是while循环并没停止。

解决:全局变量添加volatile可见性关键字。

class ThreadDemo004 extends Thread {
	
    public boolean flag = true;

    // public volatile boolean flag = true;

	@Override
	public void run() {
		System.out.println("线程开始...");
		while (flag) {
            // 死循环
		}
		System.out.println("线程结束...");
	}

        // 启动死循环\停止死循环
	public void setRuning(boolean flag){
		this.flag=flag;
	}
}

public class Test0004 {
   public static void main(String[] args) throws InterruptedException {
	  ThreadDemo004 th = new ThreadDemo004();
	  th.start();
	  Thread.sleep(3000);
	  th.setRuning(false);
	  System.out.println("flag已经改为false");
	  Thread.sleep(1000);
	  System.out.println("flag:"+threadDemo004.flag);
}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章