volatile 关键字

来源:互联网 发布:2016注册淘宝账号步骤 编辑:程序博客网 时间:2024/06/06 02:23

用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。


在jvm中,其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。

当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,

之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变

量。这样在堆中的对象的值就产生变化了。


实际上volatile并没有完全实现多线程安全,可以使用synchronized代替,但是synchronized开销会更大。