
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
volatile关键字是我们在学习java编程开发的时候需要重点掌握的一个技术能力,而今天我们就 通过案例分析来了解一下,volatile关键字的概念与用法。
1、volatile关键字是什么
如果一个变量加了volatile关键字,就会告诉编译器和JVM的内存模型:这个变量是对所有线程共享的、可见的,每次JVM都会读取新写入的值并使其新值在所有CPU可见。volatile可以保证线程的可见性并且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用内存屏障来实现的。
通过这段话,我们可以知道volatile有两个特性:
保证可见性、不保证原子性
禁止指令重排序
2、原子性和可见性
原子性是指一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行。性质和数据库中事务一样,一组操作要么都成功,要么都失败。
可见性其实和Java内存模型的设定有关:Java内存模型规定所有的变量都是存在主存(线程共享区域)当中,每个线程都有自己的工作内存(私有内存)。线程对变量的所有操作都必须在工作内存中进行,而不直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
3、指令重排序
一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序终执行结果和代码顺序执行的结果是一致的。
那么volatile关键字修饰的变量禁止重排序的含义是:
当程序执行到volatile变量的读操作或者写操作时,在其前面的操作肯定已经全部进行,且对后面的操作可见,在其后面的操作肯定还没有进行
在进行指令优化时,不能将volatile变量之前的语句放在对volatile变量的读写操作之后,也不能把volatile变量后面的语句放到其前面执行
4、volatile应用场景
synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下三个条件:
对变量的写入操作不依赖变量的当前值,或者能确保只有单个线程更新变量的值
该变量不会与其他状态变量一起纳入不变性条件中
在访问变量时不需要加锁
上面的三个条件只需要保证是原子性操作,才能保证使用volatile关键字的程序在高并发时能够正确执行。建议不要将volatile用在getAndOperate场合,仅仅set或者get的场景是适合volatile的。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!