
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存模型应用是程序员在学习java编程开发语言的时候需要重点掌握的一个编程知识点,下面我们就通过案例分析来了解一下,java编程内存模型概念与应用原因分析。
内存模型要解决的问题是:“在什么条件下,读取a的线程可以看到这个值为3?”。这听起来似乎是一个愚蠢的问题,但如果缺少同步,那么会有很多因素导致无法立即、甚至永远看不到一个线程的操作结果。这包括很多因素,如果没有使用正确的同步,例如:
编译器中生成的指令顺序与源代码中的顺序不同;
编译器将变量保存在寄存器而不是内存中;
处理器可以乱序或者并行执行指令;
缓存可能会改变将写入变量提交到主内存的次序;
处理器中也有本地缓存,对其他处理器不可见;
在单线程中,我们无法看到所有这些底层技术,他们除了提高成勋的执行速度,不会产生其他影响。Java语言规范要求JVM在线程中维护一种类似串行的语义:只要程序的终结果与在严格环境中的执行结果相同,那么上述操作都是允许的。
这确实是一件好事情,因为在近几年中,计算性能的提升在很大的程度上要归功于:
重新排序措施;
时钟频率的提升;
不断提升的并行性;
采用流水线的超标量执行单元,动态指令调整,猜测执行以及完备的多级缓存等;
随着处理器越来越强大,编译器也在不断的改进,通过指令重排序实现优化执行,以及使用成熟的全局寄存器分配算法。由于时钟频率越来越难以提高,因此许多处理器生产商都开始转而生产多核处理器,因为能够提高的只有硬件的并行性。
在多线程环境中,维护程序的串行性将导致很大的性能开销,并发程序中的线程,大多数时间里都执行各自的任务,因此线程之间协调操作只会降低应用程序的运行速度,不会带来任何好处。只有当多个线程要共享数据时,才必须协调他们之间的操作,并且JVM依赖程序通过同步操作找出这些协调操作将何时发生。
JMM规定了JVM必须遵循一组小的保证,这组保证规定了对变量的写入操作在何时将对其他线程可见。
JMM在设计时就在可预测性与易于开发性之间进行了权衡,从而在各种主流的处理器体系架构上能实现高性能的JVM。如果你不了解在现代处理器和编译器中使用的程序性能提升措施,那么在刚刚接触JMM的某些方面时会感到困惑。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。