Volatile关键字

在计算机中,数据的运算从读取到写入结果要经过以下几步:

  1.将变量从内存中读取;

  2.将变量写入cpu缓存中;

  3.由cpu运算器处理;

  4.对变量赋予新值;

  5.将变量写入缓存;

  6.将变量从缓存写入内存;

问题1:为什么说volatile变量是轻量级的锁呢,和锁的区别是什么呢?

  通过上述流程可以知道锁是锁住了一个代码块,及和锁对象有关的变量全被锁住了,不让其他线程读取,直到持有锁的线程将锁释放;

  volitale变量的特点:

      a. 1->2->3和4->5->6是连续的,正常的变量每一个步骤都是使用了一个内存屏障来隔离。

      b. 写入内存后会通知其他cpu缓存失效。

    流程如图:

        

 问题2:volitale的缺点?

    按照流程我们可以看出,如果是个正常的锁,那么所有的步骤都是没有其他线程干扰的,而volatile变量的处理和赋值动作不是连续的,

  因此,在多线程情况下就有可能两个线程都进行了相同的步骤,导致一个线程对内存写入的操作覆盖了另一个线程的操作。因此,缺点就是不够安全。

 思考:volitale变量的使用?

    通过其特点我们可以知道简单的使用如true or false 这样的命令是没有处理这一步的,即是读取后就直接赋值了。

     java对象的改变能够及时感知,当然volitale声明的只是一个对象引用,只是当引用发生变化时能够及时感知。

posted @ 2018-11-15 16:13  英长  阅读(148)  评论(0编辑  收藏  举报