【发布时间】:2011-01-30 12:57:23
【问题描述】:
我知道 Java 中 volatile 变量的目的是写入此类变量对其他线程立即可见。我也知道同步块的作用之一是将线程本地内存刷新到全局内存。
我从未完全理解在这种情况下对“线程本地”内存的引用。我知道仅存在于堆栈中的数据是线程本地的,但是当谈论堆上的对象时,我的理解变得模糊。
我希望能够让 cmets 了解以下几点:
在多处理器机器上执行时,刷新线程本地内存是否只是将 CPU 缓存刷新到 RAM 中?
在单处理器机器上执行时,这意味着什么吗?
如果堆有可能在两个不同的内存位置(每个由不同的线程访问)具有相同的变量,在什么情况下会出现这种情况?这对垃圾收集有什么影响?虚拟机做这种事情有多积极?
-
(编辑:添加问题 4) 退出同步块时会刷新哪些数据?它是线程在本地拥有的一切吗?是否仅在同步块内进行写入?
Object x = goGetXFromHeap(); // x.f is 1 here Object y = goGetYFromHeap(); // y.f is 11 here Object z = goGetZFromHead(); // z.f is 111 here y.f = 12; synchronized(x) { x.f = 2; z.f = 112; } // will only x be flushed on exit of the block? // will the update to y get flushed? // will the update to z get flushed?
总的来说,我想了解线程本地是指仅可由一个 CPU 物理访问的内存,还是虚拟机完成逻辑线程本地堆分区?
任何指向演示文稿或文档的链接都会非常有帮助。我花了很多时间研究这个,虽然我找到了很多不错的文献,但我无法满足我对线程本地内存的不同情况和定义的好奇心。
非常感谢。
【问题讨论】:
标签: java memory model multithreading