[quote]
如果CPU缓存里放了在heap里的对象,那JSP里的:Memory that can be shared between threads is called shared memory or heap memory.这句话就有点问题了,内存数据不再是共享的状态。
看一下这里:
http://www.artima.com/insidejvm/ed2/jvm2.html
有一句话:
A thread's Java stack stores the state of Java (not native) method invocations for the thread. The state of a Java method invocation includes its local variables, the parameters with which it was invoked, its return value (if any), and intermediate calculations.
似乎线程并不能copy在堆上的对象。我说效率低,是因为如果堆上的对象实际就是程序的领域对象了。这个对象集合可能非常大。比如一个graph数据结构,起内部的点边是相互关联的,线程遍历这个graph,修改每一个节点每一条边,如果依次copy对象到CPU缓存,效率是不可接受的。copy一个也许是OK的
[/quote]
JVM是由线程触发(启动)的,栈里面的内容是不会出现多线程安全的问题,栈里面的内容相当于ThreadLocal,OS线程利用CPU,关键是CPU会把内存中的数据Copy到Cache或寄存器中,如果是多核CPU中,多个线程分布在不同的核上,Cache或寄存器上就相互独立,最后提交到内存中,可能数据出现了不一致。
一般的对象是Cache足够了,大对象是有小对象组成的(或称为数据),二级缓存现在都在2MB以上,已经足够,至少可以缓存部分数据,其他部分再想内存获取,一般情况CPU会利用Cache或寄存器,而不会直接走内存,除非特殊指令控制以外,你去看看自己主板的前端总线的传输效率,常识,CPU的缓存比内存快很多很多!