课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
虽然说市场上的很对软件和程序并不是全部都采用的java语言开发的,但是并不能否认java编程语言的使用范围是最广泛的一种编程语言。
今天,我们就一起来了解和学习一下,在开发软件的时候如何通过java编程语言来建立内存模型。
Java内存模型JMM(JavaMemoryModel)主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。在Java语言中,并发采用的是共享内存模型。线程之间共享程序的公共状态,在本文中将这些共享的公共状态成为共享变量,这里的共享变量跟Java编程中的变量不是同一个概念,它包含了实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数,因为后者是线程私有的,不会共享,当然不存在数据竞争问题也不受内存模型的影响。(如果局部变量是一个reference引用类型,它引用的对象在Java堆中可被各个线程共享,但是reference引用本身在Java栈的局部变量表中,是线程私有的)。
Java线程之间的通信由Java内存模型控制,JMM决定一个线程的共享变量的写入何时对另一个线程可见。从抽象角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存被称作工作内存(WorkingMemory),线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量(volatile变量仍然有工作内存的拷贝,但是由于它特殊的操作顺序性规定,所以看起来如同直接在主内存中读写访问一般)。不同的线程之间也无法直接访问对方工作内存中的变量,线程之间值的传递都需要通过主内存来完成。工作内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。
Java内存模型围绕着并发编程中的原子性、可见性和有序性这3个特征建立的,下面依次讨论一下这3个特征。
原子性
原子性(Atomicity)即一个操作不能被打断,要么不执行,要么全部执行完毕,类似数据库中事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。
例如,对long类型的运算,很多系统就需要分成多条指令分别对高位和低位进行操作才能完成。还比如,我们经常使用的整数i++的操作,其实需要分成三个步骤:(1)读取整数i的值;(2)对i进行加一操作;(3)将结果写回内存。
可见性
可见性是指当多个线程访问同一个共享变量是,若其中某个线程更改了变量的值,其它线程可立刻看到(感知到)该变量这种修改(变化)。
有序性
在执行程序时为了提高性能,编译器和处理器常常会对指令重排序,Java内存模型中,对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序(不是所有的编译器重排序都要禁止)。对于处理器重排序,JMM的处理器重排序规则会要求java编译器在生成指令序列时,插入特定类型的内存屏障(memorybarriers,intel称之为memoryfence)指令,通过内存屏障指令来禁止特定类型的处理器重排序(不是所有的处理器重排序都要禁止)。重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
Java内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够得到保证的有序性,这个通常也称为happens-before原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能保证它们的有序性,虚拟机可以随意地对它们进行重排序。
下面就来具体介绍下happens-before原则(先行发生原则):
程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作;
volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始。
作者:sunny
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!