Java内存模型(JMM)的一些个人理解

        之前一直对Java并发编程这一块不太懂,所以对这一块的知识做一些补充。

JMM的作用

        JMM(Java 内存模型)主要定义了对于一个共享变量,当另一个线程对这个共享变量执行写操作后,这个线程对这个共享变量的可见性。

                                为什么线程之间操作变量会出现不可见问题:

        因为每个线程无法直接对主内存的内容进行修改,线程内部内存会将需要的主内存的数据拷贝一份作为副本。线程在处理业务的时候会先对其内部的数据进行修改,然后再把新数据刷回主内存。于是,在新数据刷回到主线程的过程中其他线程无法感知到变量的变化。

        解决方案:加一个volatile关键字

volatile的底层原理(为什么加一个volatile关键字就能实现线程间变量的可见性呢)

        加了volatile关键字之后,线程对相应的变量的值进行修改时会立即将修改后的数据刷新到内存中去。由于数据刷新必须经过总线,当对相应的线程做了标注的时候,其他线程能通过总线嗅探机制感知到相应的变量的变化,并将变量标记为无效,后续使用变量时就会去找最新的变量。

                                        线程指令重排使得整体结果出现问题:

        计算机为提高代码的运行效率,可能会对在保证as-if-serial和happens-before的基础上对指令的执行顺序进行重新排序。

       as-if-serial原则:不管怎么排序,当前线程的最终执行结果不能发生改变,即编译器和处理器不会对存在依赖关系的的数据进行重排序。(出现的问题:虽然当前线程的结果没有发生改变,但其中间变量可能会对其他线程的结果有影响(半初始化问题))

        happens-before原则:有八条,不用死记,即插即用,以下是常用的三条:

                1.程序规则原则:在同一个线程中,代码必须从前到后串行顺序执行

                2.锁规则:解锁操作必须发生在后续的同一个锁的加锁操作之前,也就是对于一个锁而言必须先解锁再加锁。

解决方案:加volatile关键字,volatile将会自动设置内存屏障,避免在关键的地方出现指令重排        

       

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值