美文网首页
jvm内存模型

jvm内存模型

作者: 溜溜猪66 | 来源:发表于2018-09-27 19:10 被阅读0次

    1.线程通信:内存共享、消息通信。共享内存,会拷贝主内存的一个变量副本到本地线程内存中

    2.指令重排序(1.优化,不改变语义下可以重新安排语句的执行顺序,2.指令级并行重排序,3.内存系统存在缓冲区,读写缓冲区,仅对当前处理器可见)、内存屏障指令 如果存在数据依赖(as-if-serial)不会重排序

    3.happens-before  不要求,先后的执行,只要求最后的结果可见(A->B 有数据依赖性,单线程中,就是代码顺序),  编译器和处理器(软件和硬件都支持happens-before 重排序)

    4.单线程进行重排序不会改变运行结果,多线程对控制依赖重排序,可能会改变执行结果,单个处理器才会考虑依赖性,多个处理器和不同线程之间不考虑依赖性

    5.顺序一致性模型要求线程操作执行顺序对所有线程可见,JMM不保证,因为线程有本地缓存,刷新到主内存有延时

    6.在同步的时候,编译器和处理器会使用重排序进行性能优化

    7.在未同步的时候,只保证最小的安全性,值不会无中生有,所以JVM生成对象的时候,会清零内存空间

    8.jmm保证所有基础类型的原子性,但是jmm不保证64位的 double,long的原子性(数据总线,串行化保证),因为对64保证原子性开销太大会拆分为2个32位

    9.volatile 单个的读写具有原子性,volatile++这种不具备原子性,对volatile的读,总是能看见所有线程都它的最后的写入

    10.volatile 写之后 会把本地内存的共享变量刷新到主内存,volatile读之后,会把本地变量设置为无效,再从主内存中同步

    11.volatile 写操作本质上是对所有将要读这个变量的线程的一个消息,volatile读操作是线程接收到写线程的消息(对写操作之前的共享变量的修改),写操作->读操作实际上是通过主内存向读操作发生消息(和锁具有相同的语义)

    12.线程释放锁的时候,会把本地内存中的共享变量刷新到主内存,线程获得锁的时候,会把本地内存设置为无效,然后从主内存中加载共享变量

    13.ReentrantLock 公平锁和非公平锁释放时,最后都要写一个volatile,公平锁获取时,要获得这个volatile,非公平锁获得时CAS更新volatile,同时具有读和写的语义

    14.final   在构造函数内对final的写入,不能被重排序到构造函数之外(确保了final已经初始化,而普通类型不能保证),在构造函数内读final时,保证已经加载所在的对象。在构造函数内对final引用类型的局部域修改和在构造函数外把这个引用赋值给另外一个引用不能重排序(保证了修改可见)

    15.JMM的重排序,根据会不会改变执行结果进行

    相关文章

      网友评论

          本文标题:jvm内存模型

          本文链接:https://www.haomeiwen.com/subject/xpkyoftx.html