volatile同synchronized一样,是Java中实现线程安全的一种机制。与synchronized相比,特点是使用简单、性能高,但容易出错、使用范围有限。
《Java语言规范(第三版)》中讲到: Java允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。
Java中的volatile可以看做是“轻量级的synchronized”。synchronized可能会引起上下文切换和线程调度,同时保证可见性、有序性和原子性。volatile不会引起上下文切换和线程调度,但仅提供可见性和有序性保证,不提供原子性保证。
目录:
- 相关概念
- synchronized锁与volatile变量的比较
- volatile的使用场景
相关概念
上文中提到,volatile保证可见性和有序性,不保证原子性。这里有几个概念需要了解下。
原子操作与原子性
如果一系列(或者一个)操作是不可中断的,要么都执行,要么不执行,就称操作是原子操作,具有原子性。
拿移动支付举例,A用户向B用户付款100元,其中包含两个操作:A用户账户扣减100元,B用户账户增加100元。如果这两个操作不是原子操作就可能会出错,比如A账户账户扣减100元,但B用户账户并没有增加100元。
可见性
可见性指的是多个线程对共享资源的可见性。当一个线程修改了某一资源,其他线程能够看到修改结果。
有序性
有效性指程序按照代码的先后顺序执行。
synchronized锁与volatile变量的比较
- volatile变量最大的优点是使用方便。在某些情形下,使用volatile变量要比使用相应的synchronized锁简单得多。
- 某些情况下,volatile变量同步机制的性能要优于synchronized锁。
- volatile变量不会像synchronized锁一样造成阻塞。
- volatile变量最大的缺点在于使用范围有限,而且容易出错。
总的来说volatile变量使用范围有限,不能替代synchronized,但在某些场景下,使用volatile更好。
volatile的使用场景
关于volatile的使用场景推荐阅读正确使用 Volatile 变量一文。
volatile还是比较难理解的,本文只是简单地做了介绍,以后随着理解的加深会继续完善本文。
本文暂时就讲到这里,想了解Java并发编程更多内容请参考:
- Java并发编程札记-目录
待完善。