Java 多线程volatile关键字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41723615/article/details/88709935

通过使用volatile关键字,强制的从公共内存中读取变量的值。


使用volatile关键字增加了实例变量在多个线程之间的可见性。


但是volatile关键字不支持原子性。


关键字synchronized和volatile进行比较:
1.关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,
并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新
版本的发布,synchronized关键字在执行效率上得到很大的提升,在开发中使用synchronized关键字
的比率还是比较大的。
2.多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,
因为它会将私有内存和公共内存中的数据做同步。

实例:非原子特性:

public class MyThread extends Thread {

	volatile public static int count;
	//注意一定要添加static关键字
	//这样synchronized与static锁的内容就是MyThread.class类了
	//也就达到同步的效果了
	//使用synchronized同步关键字,也就没有必要使用volatile关键字来声明count变量了。
	synchronized private static void addCount() {
		for (int i = 0; i < 100; i++) {
			count ++;
		}
		System.out.println("count=" + count);
	}
	@Override
	public void run() {
		addCount();
	}
	public static void main(String[] args) {
		MyThread[] myThreads = new MyThread[100];
		for (int i = 0; i < 100; i++) {
			myThreads[i] = new MyThread();
		}
		for (int i = 0; i < 100; i++) {
			myThreads[i].start();
		}
	}
}


3.volatile能保证数据的可见性,却不具备同步性,也就是不具备原子性。


原子类也并不完全安全。
原子类在具有逻辑性的情况下输出结果也具有随机性。


关键字volatile主要使用的场合是在多个线程中可以感知实例变量被更改了,并且可以获取最新的值使用,也就是用
多线程读取共享变量时可以获取最新值是使用。


关键字volatile提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样就保证了同步数据的可见性。
例如i++操作,此操作就是非线程安全,非原子操作。


原子操作时不能被分割的整体,在没有锁的情况下也能做到线程安全。


synchronized代码块有volatile同步的功能:
synchronized具有将线程工作内存中的私有变量与公共内存中的变量同步的功能。

 

扫描二维码关注公众号,回复: 5626530 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41723615/article/details/88709935