开发者社区> 问答> 正文

JVM内存模型操作的多余步load和write有什么用?

蛮大人123 2016-02-29 16:14:37 947

关于JVM内存模型的描述可以看这个链接:http://flyingdutchman.iteye.com/blog/1856802
lock(锁定):将一个变量标识为被一个线程独占状态。
unlock(解锁):将一个变量从独占状态释放出来,释放后的变量才可以被其他线程锁定。
read(读取):将一个变量的值从主内存传输到工作内存中,以便随后的load操作。
load(载入):把read操作从主内存中得到的变量值放入工作内存的变量的副本中。
use(使用):把工作内存中的一个变量的值传给执行引擎,每当虚拟机遇到一个使用到变量的指令时都会使用该指令。
assign(赋值):把一个从执行引擎接收到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的指令时,都要使用该操作。
store(存储):把工作内存中的一个变量的值传递给主内存,以便随后的write操作。
write(写入):把store操作从工作内存中得到的变量的值写到主内存中的变量。

我的问题是read可以直接把主内存中的变量放到线程的工作内存来,为什么要搞个load创建一个副本?read的时候不就相当于给主内存中对应的变量创建了一个副本吗?而且write也是一个废操作,可以直接写入的啊?

存储 Java
分享到
取消 提交回答
全部回答(1)
  • 蛮大人123
    2019-07-17 18:50:28

    简单说你可以这么看
    •read是把变量从shared memory读入CPU local memory,或者说从内存读入CPU cache,write反之
    •load是把变量从CPU local memory读入JVM stack,你可以认为它是把数据从CPU cache读入到“JVM寄存器”,store反之

    之所以会这么麻烦,是因为现代电脑都有不止一个CPU,每个CPU都有自己的1级2级甚至3级缓存,CPU之间共享主存,一个CPU对主存所做的改动并不会自动被其它CPU发现,必须有某种机制让其它CPU知道这一点,当然最简单的思路是让cache和主存永远同步,但cache的速度远高于主存,强制同步其实相当于把cache强制降速,这对于程序执行效率是不利的。
    现在的做法是选择性的同步,当你不需要同步时,只需要一次load,然后就可以多次read/write,避免和主存的同步,这样可以让这个CPU保持最高的效率运转;当你需要同步时,用store将变更写回主存,JVM/CPU/MMU会协调将这个变更通知到其它CPU以保证程序的正确性。
    use是用来配合上述过程的,只有use了特定变量的CPU才会收到针对这个变量做store时发出的通知,这样就避免了无谓的CPU cache flush操作。

    lock/unlock是传统方式,用来限制CPU对共享区域操作的,如果一个变量被lock了,那么其它所有CPU针对这个变量做出的lock操作都回阻塞直到拥有者释放这个锁。
    以上是一个极为简化的memory model说明,里面还有很多细节需要长篇大论才说的清。

    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题