Java 多线程 -- volatile 山寨版的synchronized

在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。

在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是一个轻量级的synchronized,但是 volatile 并不能保证数据的原子性。

下面看一下加了volatile 和没有加 volatile的区别:
不加volatile:

public class VolatileTest {
	private  static int num = 0;
	public static void main(String[] args) throws InterruptedException {
		new Thread(()->{
			while(num == 0) {
				if(num == 1) {
					System.out.println("num=" + num);
					break;
				}
			}
		}).start();
		
		Thread.sleep(1000);
		num = 1;
	}
}

运行以上代码:
在这里插入图片描述
由于 while 循环 是一个比较底层的代码,所以一秒后,循环并没有结束。

下面给变量加上volatile 关键字测试:

public class VolatileTest {
	private volatile static int num = 0;
	public static void main(String[] args) throws InterruptedException {
		new Thread(()->{
			while(num == 0) {
				if(num == 1) {
					System.out.println("num=" + num);
					break;
				}
			}
		}).start();
		
		Thread.sleep(1000);
		num = 1;
	}
}

再运行代码:
在这里插入图片描述

运行代码1s 后可以看到循环结束。

posted @ 2020-04-03 01:46  行者老夫  阅读(170)  评论(0编辑  收藏  举报