
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言是目前大多数软件开发程序员都在学习和使用的一种编程开发语言,今天我们就简单来了解一下,Java编程内存模型基础知识分享。
由于多核CPU和高速缓存在存在,导致了缓存一致性问题。这个问题属于硬件层面上的问题,而解决办法是各种缓存一致性协议。不同CPU采用的协议不同,MESI是的一个缓存一致性协议。
操作系统作为对底层硬件的抽象,自然也需要解决CPU高速缓存与内存之间的缓存一致性问题。各个操作系统都对CPU高速缓存与缓存的读写访问过程进行抽象,终得到的一个东西就是「内存模型」。
从硬件到操作系统,这个是我自己的理解,我并没有找到一些资料提到这点。但我觉得这应该是没有错的。因为操作系统就是对底层硬件的抽象,而所有抽象的东西就需要定义一些概念。
对于操作系统来说,这些概念就是内存模型、CPU时间片等。内存模型这个词,在操作系统的教科书上也是可以找到的,这也是一个佐证吧。
于是,我们从硬件层面理解到了操作系统层面,但这跟Java内存模型有啥关系呢?
Java语言作为运行在操作系统层面的高级语言,为了解决多平台运行的问题,在操作系统基础上进一步抽象,得到了Java语言层面上的内存模型,其也是为了解决多线程情况下的数据一致性问题。
我们是因为要实现Java语言的「WriteOnce,RunAnywhere」的理念,那么就必须解决多平台内存模型不一致的问题,这样才创造出了Java内存模型。
Java内存模型规定了很多规则,如果Java程序能够遵守Java内存模型的规则,那么其写出的程序就是并发安全的,这就是Java内存模型大的价值。
到这里,我们从硬件、操作系统再到语言层面,知道了Java内存模型诞生的原因,知道其诞生就是为了解决多平台的内存模型统一问题,进一步其实就是多线程的数据一致性问题。
happens-before原则
前面说到,为了解决多平台的内存模型统一,以及多线程的数据一致性问题,所以有了Java内存模型。但是Java内存模型的内容太多了,基本就记不住,非常不利于编程人员理解,所以才有了happens-before原则。
所以说happens-before原则是对Java内存模型的简化,让我们更好地写出并发代码。
volatile关键字
volatile关键字,其实也与Java内存模型有关系,只是很多文章都没说清楚。
volatile关键字有两个作用,就是可见性和禁止指令重排序。但为啥它有这两个作用呢?其实volatile这两个作用的来源,就来自于Java内存模型里对volatile变量定义的特殊规则。
这就是volatile关键字与Java内存模型的关系,比较简单。
至于内存屏障这个词,其实就是一个让我们方便理解的名词,诞生于volatile禁止指令重排序这个作用里,也没啥不好理解的。
synchronized关键字
synchronized关键字,也是并发编程常用到的内容,其实它和Java内存模型没关系,但和Java虚拟机规范有关系。
synchronized关键字经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令,这两个字节码的执行需要指明一个要锁定或解锁的对象。而monitorenter和monitorexit这两个字节码指令为啥能实现这样的功能,是因为Java虚拟机中做了强制定义,那么虚拟机就需要实现。
synchronized关键字与Java对象的内存布局,也是有关系的。自旋锁、自适应锁、偏向锁,它们靠什么实现,就是Java对象中的对象头去判断,然后进行一系列的逻辑操作。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。