Java-volitail关键字

1.volitail关键字的语义

被volitail修饰的实例变量或者类变量具备如下两层语义;

1)保证了不同线程之间对共享变量操作的可见性,也就是说当一个线程修改volitail修饰的变量,另外一个线程会立即看到最新的值。

2)禁止对指令进行重排序操作。

2.volitail保证可见性

Reader线程从主内存中获取init_value的值为0,并且将其缓存到本地工作内存中。

Updater线程将init_valued的值在本地工作内存中修改为1,然后立即刷新至主内存中。

Reader线程在本地内存中的init_value失效,因此需要到主内存中重新读取init_value的值。

3.volitail保证了有序性

    volitail会直接禁止JVM和处理器对volitail关键字修饰的指令重排序,但是对于volitail前后无依赖关系的指令则可以随便怎么排序。

4.volitail不保证原子性

    多个线程对i执行i++;最后的结果肯定是错误的;

    i++的操作其实是分三步组成的:

1)从主内存中获取i的值,然后缓存至线程的工作内存中;

2)在线程工作内存中为i进行加1操作

3)将i的最新值写入主内存中

 上面三个步骤中,每一步都是原子性,但是合起来就不是了。多线程情况下即使加上volitail也不能保证当前操作为原子性操作。

5.什么情况下volitail能够保证线程安全

    其实在大多数情况下volitail还是可以保证变量的线程安全问题的。所以,在满足以下两个条件的情况下,volitail就能保证变量的线程安全问题:

    1.运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。

    2.变量不需要与其他状态变量共同参与不变约束。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值