Java多线程总结之(三)volatile关键字

  • A+
所属分类:Java多线程

使用volatile关键字主要是为了让多个线程能取到正确的实例变量的值。它能强制的从公共内存中读取变量的值。但volatile关键字最致命的缺点是不支持原子性。

 

Volatile与synchronized比较:

 

  • volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。
  • 多线程访问volatile不会阻塞,而synchronized会出现阻塞。
  • Volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。
  • Volatile解决的是变量在多个线程之间的可见性。Synchronized解决的是多个线程之间访问资源的同步性。

 

这里需要注意的是,修改实例变量中的数据,比如i=i+1,这样的操作并不是一个原子操作,也就是非线程安全的。表达式i++的操作步骤分解如下:

  • 从内存中取出i的值
  • 计算i的值
  • 将i的值写到内存中

假如在2)计算i的值时,另外一个线程也修改i的值,那么这时候就会出现脏数据。解决办法其实就是使用synchronized关键字。

 

另外,synchronized代码块有volatile同步的功能。

ZPY

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: