使用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同步的功能。