C++ PK Java 之 volatile

本文探讨了Java和C++中volatile关键字的区别。在Java中,volatile确保内存可见性和指令重排序,而C++中的volatile仅保证可见性,不阻止指令重排。作者通过示例代码展示了两种语言中volatile的不同行为,并指出在C++中使用volatile可能带来的问题。
摘要由CSDN通过智能技术生成

昨天看了一篇异步社区的文章,linux之父又没有忍住,狠狠了抨击了C++,“世界上最烂的语言!”、“要学就学C,再加一门带GC的语言就够了”。起因是rust要入驻linux内核,但是有网友说还不如上C++。

看到上的的说辞我回想了一下自己一年多以来入手C++后的一些尴尬的事情,个人认为C++确实难学,博大精深。1-2年只能说了解,2-3年智能说熟悉,3-5年才能说精通吧。

如果说C++是C的升级包装版,那Kotlin是Java的啥?有不同意见的读者,欢迎在评论区留言。不扯犊子了,下面进入正文。

Java 和C++中的关键字volatile到底有啥区别呢?

个人是从Java转行到C++开发的,起初也以为volatile在java和c++中应该是一个鸟样,直到后续项目上的多处暴雷,警醒了我。于是乎网络各种搜罗资料,终于找到了一些蛛丝马迹。

前几年我在做Android开发的时候,在知乎上回答过这样一个问题:java多线程中volatile关键字到底有什么用啊?

下面是我的回答:
这个问题确实很难用代码来复现,完全就是跟主存回写抢时间啊。大概撸了一段code,确实可以看出volatile的功效。“悲剧《我被停止了” 不管过多久都不会打印,这个线程死在while了

public class TestArr {
	static boolean isKill = false; //volatile修饰后结果不一样
	public static void main(String[] args) {
		new Thread(){
			public void run() {
				while(!isKill) {
				}
				System.out.println("悲剧《我被停止了");
			};
		}.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		isKill = true;
		System.out.println("赶快停止吧 iskill = " + isKill);
	}

}

在Java中,volatile是同时保证了内存可见性、有序性即指令重排的。所以上述code只需要将

static boolean isKill = false;
//更改为
static volatile boolean isKill = false;

那结果就会和预期一致了。

JAVA果然是世界上最最最好的编程语言!!!

但是在C++的世界里,volatile就是一个坑,一个深坑!!!

还是用上述同样的code,用C++改写了下,结果却截然不同。就算加上volatile还是一个熊。

参考:
https://zh.cppreference.com/w/cpp/atomic/memory_order
https://blog.csdn.net/gadbee5/article/details/51539487

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值