java并发编程学习之Volatile

特性

可见性

volatile变量,是稍弱的同步机制,不会被缓存到寄存器或者其余处理器不可见的地方,所以读取时,总会返回当前的最新值。这个性质,就是可见性,是Volatile的关键做用之一。可是Volatile的语义不足以确保递增操做的原子性,在多线程的状况下,线程不必定是安全的。缓存

禁止重排序

由于编译器优化、指令重排序、内存系统重排序缘由,程序执行的顺序,不必定等于咱们编写的顺序,Volatile会禁止重排序。安全

经常使用场景:

禁止重排序

单例模式(懒汉模式)
clipboard.png
咱们模拟两个线程A,B,在还没建立单例对象的时候,一块儿进入getInstance方法。多线程

  • A进入16行,此时singleton为空,时间片结束。
  • B也进入16行,获取到的singleton也是空,时间片结束。
  • A进入17行,这边是对象锁,,B在等待A执行完这个代码块。
  • A执行完,生成singleton对象,因为重排序,singleton对象的其余域可能还没初始化。
  • B继续执行,此时获取singleton,可是其余域可能还没初始化,调用时,报空指针异常。

可见性

检查某个状态标记,以判断是否退出循环优化

Volatile boolean done;
....
某个方法{
    while(done){
       doSomeThing1();
    }
    doSomeThing2();
}

这边和用普通的变量的区别是,在多线程的状况下,取到done后,done的值被改变了,while判断会不正确。spa

使用的条件

  1. 对变量的写入操做,不依赖变量的当前值,或者确保单线程更新变量的值
  2. 该变量不会和其余变量一块儿归入不变形条件中
  3. 访问变量时,不须要加锁
相关文章
相关标签/搜索