1.violate变量
violate修饰变量表示该变量是容易更改的,因此不能被编译优化,也不存储在寄存器(每个线程都有自己独立的寄存器)。
对于某个全局变量,被多个线程使用访问,某些线程可能会将变量的值存储在寄存器中,以便后续使用。当该变量被某个线程修改后,其它线程仍读取之前保存在线程寄存器中的该变量的值,并不能及时更新当前最新的值,因此会出现不一致的情况。
使用violate修饰的变量则可避免这种情况。使用violate修饰的变量,线程会直接从全局变量对应的地址进行访问,而不会从线程对应的寄存器访问。
2.register变量
当某一变量需要被频繁使用,为了存取变量值少花些时间,则将该变量直接放在寄存器中,需要时直接从寄存器读取参与运算,而不需要从内存中读取。寄存器读取速度远大于内存访问速度,这种变量被成为寄存器变量。
(1)只有局部自动变量和形式参数可以作为寄存器变量,全局变量不行;
(2)计算机系统中寄存器数目有限,不能定义任意多个寄存器变量;
(3)局部静态变量不能定义为寄存器变量,存储在静态变量区,在编译时提前分配好内存;
(4)寄存器变量必须是单一变量,长度小于整型变量。