synchronized 不是可以保证有序性的吗?volatile的有序性?synchronized 不能够保证指令重排吗?

怎么来定义顺序呢?《深入理解Java虚拟机第三版》有提到

Java程序中天然的有序性可以总结为一句话:如果在本线程内观察,所有操作都是天然有序的。如果在一个线程中观察另一个线程,所有操作都是无序的。前半句是指“线程内似表现为串行的语义”,后半句是指“指令重排”现象和“工作内存与主内存同步延迟”现象。

  • 「synchronized」 的有序性是持有相同锁的两个同步块只能串行的进入,即被加锁的内容要按照顺序被多个线程执行,但是其内部的同步代码还是会发生重排序,使块与块之间有序可见。
  • 「volatile」的有序性是通过插入内存屏障来保证指令按照顺序执行。不会存在后面的指令跑到前面的指令之前来执行。是保证编译器优化的时候不会让指令乱序。
  • 「synchronized 是不能保证指令重排的」。
  • synchronized可以保证原子性和可见性

volatile关键字关于指令重排序的解释

// volatile关键子保证代码不进行指令重排的意思是被volatile修饰的代码不会跑在代码1和代码2前面,
//也不会跑到代码3和代码4后面,但是不能保证代码1和代码2发生重排序的问题或者代码3和代码4进行重排序
public volatile int a=15
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值