Volatile关键字

@[toc]

Volatile关键字

线程三大特性

首先了解Voiatile关键字,需要了解线程的三大特性

1. 原子性: 要么成功,要么失败 2. 可见性: 多个线程同时访问一个变量时,一个线程修改了这个变量值,其他线程立马可以看到 3. 有序性: 程序的执行顺序按现在的顺序

了解了线程3大特性,我们就可以深入了解Volatile关键字了


什么是Volatile

Volatile是java虚拟机提供的轻量级同步机制

  • 保证了可见性
  • 禁止指令重排序
  • 不能保证原子性

可见性详解

可见性是说一旦某个线程修改了被Volatile修饰的变量,他会保证修改的值立马被更新到主内存,其他线程访问时可以立即获取修改的值,如下代码

public volatile Integer a = 1;

在java中为了加快程序运行效率,对于一些变量操作,常量,是在线程寄存器 或是 CPU缓存进行的,之久才会同步主内存,而加了Volatile后直接读写主内存

Volatile保证了了变量可见性,但是不能保证原子性 .

原子性详解

要么成功,要么失败 为什么Volatile 不能保证原子性

public volatile int a = 1;
    
    public  void add(){
        a++;
    }

如果有多条线程同时调用add方法

1.从主内存 获取 数据 2.进行+1操作 3.写回主内存 如果同时调用都会读取到 比如 0 都会同时 +1 ,循环100次 ,可能会导致打印出来结果小于 100

禁止指令重排序

指令重排序是指cpu采用了允许多条指令不安程序规定顺序分开给各个电路单元处理

因此,加上Volatile 关键字后可以防止进行排序

性能

Volatile 读性能和普通变量差不多,但写操作慢,他需要在本地代码插入许多内存屏障指令,不发生乱序

Volatile与Synchronized区别

(1)从而我们可以看出volatile虽然具有可见性但是并不能保证原子性。 (2)性能方面,synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized。 但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。


end
  • 作者:yxl(联系作者)
  • 发表时间:2020-08-11 14:46
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论