java内存屏障详解 有人说c语言开发效率比java低是哪些因素导致的?
有人说c语言开发效率比java低是哪些因素导致的?由于标准C语言不提供操作系统的内容,如果您想为系统开发应用程序,需要使用系统提供的API。比如微软的系统是MFC,使用起来很麻烦,不能跨平台。但是,J
有人说c语言开发效率比java低是哪些因素导致的?
由于标准C语言不提供操作系统的内容,如果您想为系统开发应用程序,需要使用系统提供的API。比如微软的系统是MFC,使用起来很麻烦,不能跨平台。但是,Java在虚拟机中运行。只要使用虚拟机提供的类库来完成应用程序,就不需要再学习系统API,只要操作系统支持Java虚拟机,跨平台非常方便。还有封装效率的问题。Java提供的类库相对简单,使用方便。这与C的MFC有关,也与开发环境有关。用VC6.0开发Windows应用程序是用C语言编写的,但我认为这并不是所见即所得。研究Java的组织结构对您来说是很费时的。但是,Java环境要简单得多。最后,C不支持面向对象的Java,但我不认为这是重点,因为如果你不需要从头开始构建Java,你不需要C来方便
volatile是为了防止指令重新排序以确保可见性
对于JVM级别,它是为了防止编译器重新排序
同时同时,对于一些CPU,他们会通过缓存锁或线程来解决缓存可见性问题
但是目前很多CPU已经进行了优化,因为缓存一致性MESI会带来性能开销,所以采用storebuffer机制进行异步处理,这种机制会带来指令无序的实现。这会导致可见性问题。
然后volatile将在CPU级别增加内存屏障,以解决由于CPU执行无序而导致的可见性问题
简要说明以下原因:
锁定是因为操作不是原子的。让我们把我的手术作为一个解释。参见下面两个图。
我这个操作需要
看上面的第二个图,你能很清楚地理解这个过程吗?
锁定是为了确保上述三个步骤是原子操作。
回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。
但是,如果你看第一张图片,因为主内存和本地内存的存在
在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。
添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。