Java并发编程——第3章:对象的共享(二)

3.1.4 Volatile变量

  • Java语言提供了一种削弱的同步机制,即Volatile变量,用来确保将变量的更新通知到其他线程。
  • 在访问Volatile变量时不会执行加锁操作,因此也就不会执行线程阻塞,是一种比synchronized更轻量级的同步机制。
  • 当把变量声明为Volatile后,编译器和运行时都会注意到这个变量是共享的,因此不会讲该变量上的操作与其他内存操作一起重排序。Vloatile变量不会被缓存在寄存器或者其他处理器不可见的地方,因此在读取该类型变量时总会返回最新写入的值。
  • 写入Volatile变量值相当于退出同步代码块,而读Volatile变量相当于进入代码块。
  • 不能过度依赖Volatile变量提供的可见性,因为其通常比使用锁的代码更脆弱,也更难理解。仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它们。其正确的使用方式是:确保自身状态的可见性,确保它们所引用对象的可见性,以及标识一些重要的程序生命周期事件的发生。

  • 加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
  • 当且仅当满足一下条件才使用volatile变量:
    • 对变量的写入操作完全不依赖变量当前的值,或者确保只有单个线程更新变量的值
    • 该变量不会与其他变量一起纳入不变性条件中
    • 在变量访问时不需要加锁

3.2 发布与逸出 

猜你喜欢

转载自blog.csdn.net/Curry7895/article/details/82696771
今日推荐