java内存模型中的原子性、有序性、可见性

可见性:比如,两个线程,一个线程修操作一个数据,更新了主内存之后,另一个线程必须立马能看到(要强制更新自己的工作内存里面的数据,或强制失效);

如果没有可见性,上面的代码,第二个线程可能主存中的变量已经等于1了之后,while了一段时间后才等于true。

原子性:以内存模型图作为例子,线程1执行完read、load、use、assign、store、write之前,不允许线程2执行这些操作;线程1执行完了之后,线程2才允许执行。没有原子性,例如,两个线程同时执行了。

有序性:具备有序性,不会发生指令重排导致我们的代码异常;不具备有序性,可能会发生一些指令重排,导致代码可能会出现一些问题(一般是单线程执行的话,能保证有序性吧)。

对于代码,同时还有一个问题是指令重排序,编译器和指令器,有的时候为了提高代码执行效率,会将指令重排序,就是说比如下面的代码

重排序之后,让flag = true先执行了,会导致线程2直接跳过while等待,执行某段代码,结果prepare()方法还没执行,资源还没准备好呢,此时就会导致代码逻辑出现异常。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值