深入Java底层:内存屏障与JVM并发详解Java认证考试

文章作者 100test 发表时间 2010:05:01 21:36:34
来源 100Test.Com百考试题网


  内存屏障,又称内存栅栏,是一组处理器指令,用于实现对内存操作的顺序限制。本文假定读者已经充分掌握了相关概念和Java内存模型,不讨论并发互斥、并行机制和原子性。内存屏障用来实现并发编程中称为可见性(visibility)的同样重要的作用。

  内存屏障为何重要?

  对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。当数据是不可变的,同时/或者数据限制在线程范围内,这些优化是无害的。

  如果把这些优化与对称多处理(symmetric multi-processing)和共享可变状态(shared mutable state)结合,那么就是一场噩梦。当基于共享可变状态的内存操作被重新排序时,程序可能行为不定。一个线程写入的数据可能被其他线程可见,原因是数据写入的顺序不一致。适当的放置内存屏障通过强制处理器顺序执行待定的内存操作来避免这个问题。

  内存屏障的协调作用

  内存屏障不直接由JVM暴露,相反它们被JVM插入到指令序列中以维持语言层并发原语的语义。我们研究几个简单Java程序的源代码和汇编指令。首先快速看一下Dekker算法中的内存屏障。该算法利用volatile变量协调两个线程之间的共享资源访问。

  请不要关注该算法的出色细节。哪些部分是相关的?每个线程通过发信号试图进入代码第一行的关键区域。如果线程在第三行意识到冲突(两个线程都要访问),通 过turn变量的操作来解决。在任何时刻只有一个线程可以访问关键区域。

  1. // code run by first thread


相关文章


Java实现托盘管理Java认证考试
Java内部类与匿名内部类Java认证考试
Java线程通信简单调试方法介绍Java认证考试
Java编程语言回顾之初学者必读Java认证考试
深入Java底层:内存屏障与JVM并发详解Java认证考试
Java多线程同步具体实例讲解Java认证考试
Java线程控制权源代码的深入探讨Java认证考试
Java多线程中wait语句的具体使用方法Java认证考试
应用OSCache提升J2EE系统运行性能Java认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛