Java中的关键字volatitle

一.作用:

   1. 保证被volatitle修饰的变量对所有的线程是可见的,即当一个线程修改了这个变量

    新值对其他线程来说是可以立即得知的,但运算非原子操作,不能保证并发下的安全性

    (即i=i++当读出i的值是最新的,但+的过程中i的值被其他线程改变了)

    普通变量的值在线程传递需要通过主内存来完成(即A线程修改一个普通变量的值,将值回写进内存,B线程在从主内存读取,新值对B线程才可见)

   2.禁止指令重排序优化

    volatitle修饰的变量读操作和普通变量几乎没有差别,写操作慢一些,比锁的开销低

    在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制

    在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,无法得到正确的结论。

    这个看上去像是一个失败的设计,但却能使JVM充分地利用现代多核处理器的强大性能。例如,在缺少同步的情况下,Java内存模型允许编译器对操作顺序进行重排序,并将数值缓存在寄存器中。此外,它还允许CPU对操作顺序进行重排序,并将数值缓存在处理器特定的缓存中。