java的线程机制(二)

Java 的内存模型 JMM(Java Memory Model)

由于程序的最终运行方式是将程序中各变量(实例域、静态域和数组元素)存入内存,然后通过处理器的加工,再从内存中取出,所以对于单处理器,程序怎样将变量存入内存,以及怎样取出
都不会影响程序的实际运行,而对于多处理程序,变量的存入和取出却变的至关重要,这也是在
讨论Java的线程机制时我们必须面对的问题。所以在这里我先把JMM拿出来总结,因为以后在总结
线程的时候我会多次拿JMM说事。

先定义一下内存模型([color=red]来自Brian Goetz 的修复 Java 内存模型,第 1 部分[/color]):内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。对象最终存储在内存中,但编译器、运行库、处理器或缓存可以有特权定时地在变量的指定内存位置存入或取出变量值。例如,编译器为了优化一个循环索引变量,可能会选择把它存储到一个寄存器中,或者缓存会延迟到一个更适合的时间,才把一个新的变量值存入主存。所有的这些优化是为了帮助实现更高的性能,通常这对于用户来说是透明的,但是对多处理系统来说,这些复杂的事情可能有时会完全显现出来。

那么JMM是什么呢?再来一段([color=red]来自Brian Goetz 的修复 Java 内存模型,第 1 部分[/color]):The JMM allows the compiler and cache to take significant liberties with the order in which data is moved between a processor-specific cache (or register) and main memory, unless the programmer has explicitly asked for certain visibility guarantees using synchronized or volatile. This means that in the absence of synchronization, memory operations can appear to happen in different orders from the perspective of different threads.

这一段在rian Goetz 的修复 Java 内存模型,第 1 部分翻译的相当晦涩,我偷了一下懒,也不做翻译了,大概意思是JMM会将一个变量保存两份,而这两份对于java的编译器都是合法
的,[color=red]但是,注意了这两份变量在同一时刻,对处理器可能是不一致的[/color],具体的讨论可以参考这个链接:[url]http://www.ibm.com/developerworks/cn/java/j-jtp02244/[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值