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