C++ PK Java 之 volatile
昨天看了一篇异步社区的文章,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