volatile

一.定义:

    volatile是相较于synchronized的轻量级锁,可保持数据的可见性,但是不能保证操作的原子性.

    volatile所修饰的变量是直接存在于主内存中的,线程对变量的操作也是直接反映在主内存中,所以说其是易变的。

  JMM中的内存分为主内存和工作内存,其中主内存是所有线程共享的,而工作内存是每个线程独立分配的,各个线程的工作内存之间相互独立、互不可见。在线程启动的时候,虚拟机为每个内存分配了一块工作内存,不仅包含了线程内部定义的局部变量,也包含了线程所需要的共享变量的副本,当然这是为了提高执行效率,读副本的比直接读主内存更快。

  volatile修饰的变量(共享变量)来说,在工作内存发生了变化后,必须要马上写到主内存中,而线程读取到是volatile修饰的变量时,必须去主内存中去获取最新的值,而不是读工作内存中主内存的副本,这就有效的保证了线程之间变量的可见性。

二.volatile特性:

       1)内存可见性,线程直接读取主内存中的数据,修改数据后直接保存数据到主内存中.

       2)可以禁止指令重排序.   

           指令重排序:为了尽可能减少内存操作速度远慢于CPU运行速度所带来的CPU空置的影响,虚拟机会

        按照自己的一些规则将程序编写顺序打乱。

 

三.volatile 与 synchronized 的比较

     volatile主要用在多个线程感知实例变量被更改了场合,从而使得各个线程获得最新的值。它强制线程每次从主内存中讲到变量,而不是从线程的私有内存中读取变量,从而保证了数据的可见性。

     ①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法

     ②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

         synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有     语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

 

阅读更多
个人分类: 多线程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭