Java并发编程札记-(一)基础-07volatile详解
来源:互联网 发布:什么是qq群淘宝客 编辑:程序博客网 时间:2024/05/21 06:57
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并发编程札记-目录
待完善。
- Java并发编程札记-(一)基础-07volatile详解
- Java并发编程札记-(一)基础-04Thread详解
- Java并发编程札记-(一)基础-06synchronized详解
- Java并发编程札记-(一)基础-01基本概念
- Java并发编程札记-(一)基础-02创建线程
- Java并发编程札记-(一)基础-03线程的生命周期
- Java并发编程札记-(一)基础-05线程安全问题
- Java并发编程:volatile详解
- Java并发编程--Volatile详解
- Java并发编程--Volatile详解
- java基础——并发编程:volatile
- Java并发编程一:volatile关键字
- java并发编程之volatile详解
- java并发编程---volatile
- Java并发编程:volatile
- java并发编程 volatile
- 【Java并发】- volatile详解
- Java并发编程札记-目录
- 【IPFS + 区块链 系列】 入门篇
- 对于天海投资未来发展,海航陈峰运筹帷幄
- Momenta详解ImageNet 2017夺冠架构SENet
- NameNode之租约管理
- Linux device tree(设备树)
- Java并发编程札记-(一)基础-07volatile详解
- 【java多线程编程核心技术】4.Lock的使用-笔记总结
- Android Recyclerview GridLayoutManager列间距
- Linux下配置软件安装源&更新
- 如何改变swagger请求的url
- Mybatis # 和 $ 的区别
- Akka(37): Http:客户端操作模式
- Source Insight如何改变背景颜色
- NameNode之文件系统目录树