在多核时代,如何提高CPU的性能成为了一个永恒的话题,而这个话题的讨论主要就是如何定义一个高性能的内存模型,内存模型用于定义处理器的各层缓存与共享内存的同步机制及线程和内存交互的规则。
Java的世界也有属于它自己的内存模型,Java内存模型,即Java Memory Model,简称JMM。由于Java被定义成一种跨平台的语言,所以在内存的描述上面也要能是跨平台的,Java虚拟机试图定义一种统一的内存模型,能将各种底层硬件及操作系统的内存访问差异进行封装,使Java程序在不同硬件及操作系统上都能达到相同的并发效果。它描述了程序中各个变量之间的关系,包括实例域、静态域、数据元素及在实际计算机系统中将变量存储到内存和从内存中取出变量的底层细节。
为更好理解JMM的工作机制,由图带入,从整体上看有几个比较重要的主体,主存、工作内存、变量、变量副本、线程等。首先看主存与工作内存及他们的关系,主存保存了java程序的所有变量,当然这个变量不包括局部变量和方法参数,而工作内存则包含了这些变量的副本;其次是线程与工作内存的关系,每个线程都有一个属于自己的工作内存,不同线程之间的工作内存是互相不可见的,且线程对变量的操作也只能是针对自己的工作内存;最后是关于线程之间的通信机制,由于线程之间不可直接传递,假如一条线程对一个变量进行重新赋值,那么只能通过如下途径让另外一条线程知道,线程一将变量改变反应到主存中,线程二再从主存中读取,这样就基本完成了线程之间的通信了。
JMM定义了八个操作来完成工作内存与主存的通信。假如一条线程准备对一个变量进行新的赋值操作,它可能会先用lock操作锁住主存中的某个变量(不让其他线程获得此变量的锁,直至使用unlock操作释放该变量的锁),接着使用read操作将变量从主存独到工作内存,紧接着load操作将得到的变量值放到工作内存中的变量副本,use操作则将变量值传给线程执行引擎进行运算操作,assign操作把新的变量值从线程执行引擎中传递到工作内存,继续往下,store操作则把变量值从工作内存传送到主存中,接着write操作将得到的值写入主存相应的变量中,最后使用unlock操作释放变量的锁。
Java内存模型具有三个特性:原子性、可见性和有序性。
JMM可以说是Java的基础,它的定义将直接影响JVM及java多线程实现的机制,要想深入了解多线程并发中的相关问题现象,对Java内存模型的深入研究是必不可少的。它的定义必须考虑下面几个方面,其一是如何更加有效地提高线程的性能效率;其二是如何将底层物理硬件及操作系统的差异屏蔽掉提供统一的对外概念;最后是如何使它的模型既严谨又宽松,保证语义不会产生歧义和一些优化扩展。
转自:http://blog.csdn.net/wangyangzhizhou/article/details/72111399
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。