当前位置: 代码迷 >> 综合 >> volitail关键字
  详细解决方案

volitail关键字

热度:34   发布时间:2024-02-10 16:02:26.0

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.变量不需要与其他状态变量共同参与不变约束。

  相关解决方案