volatile关键字的两层语义

volatile关键字的两层语义

(1)保证了不同线程对这个变量进行操作时的可见性

首先说一下java线程。
每当开启一个Java线程时,jvm就会给该线程分配一块工作内存,并把共享变量复制一份到该工作内存。线程对共享变量进行操作时,只是操作工作内存中该变量的副本,并不是主存中的变量。
如下图所示
接下来再探讨volatile关键字的作用
若线程A与线程B共享变量x被volatile修饰,当线程A对变量x进行写入操作时,线程A的工作内存中的x变量副本会把x的值更新到主存中,再由主存更新到线程B的工作内存中。也就是说当一个线程对共享变量更新后,其他线程的工作内存以及主存都会更新该变量。这就保证了不同线程对这个变量进行操作时的可见性。

(2)禁止进行指令重排序

首先说一下:Java编译器在对Java程序进行编译时,可能不是按照从上到下的书写顺序来安排指令执行的先后顺序的。
假如两条指令:指令1和指令2在书写时1在2的前面,但经过编译后,指令2比指令1先执行,但不影响在单线程中的执行结果,然而不保证在多线程中的执行结果不会改变,这就是指令重排序。若共享变量x用volatile修饰,则以对变量x操作的指令为界,保证在它之前的指令不会被重排序到它后面,同样,它之后的指令不会被重排序到它前面。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值