现如今,我们处于一个新兴技术高速发展的时代,各个产业对于开发人员的需求更多、更高。因此,无论是在入门阶段还是进阶阶段都需要学习大量的专业知识,不断提高对Java的认识是必要的。
孝感网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
不论是求职面试还是项目实际开发,volatile都是一个需要掌握的知识点,今天,我们就一起来认识volatile机制,从实战中精进我们的能力吧。
java是面向对象的高级编程语言,Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,volatile是Java提供的一种轻量级的同步机制。
在Java多线程的开发中有三种特性:原子性、可见性、有序性,使用volatile不会引起线程上下文的切换和调度,可以保证内存可见性和防止指令重排序。
在Java语言里,volatile关键字是用来修饰变量的,方式如下入所示。表示:该变量需要直接存储到主内存中。
- public class SharedClass {
- public volatile int counter = 0;
- }
被volatile关键字修饰的 int counter 变量会直接存储到主内存中。并且所有关于该变量的读操作,都会直接从主内存中读取,而不是直接从CPU缓存。
理解 volatile 关键字
对于初学者来说,volatile只是简单的了解,只知道volatile作用就是“保证可见性”、“禁止指令重排序”,但是仍然存在一些误区。
变量可见性问题(Variable Visibility Problem) : volatile可以保证变量变化在多线程间的可见性。 |
一个多线程应用中,出于计算性能的考虑,每个线程默认是从主内存将该变量拷贝到线程所在CPU的缓存中,然后进行读写操作的。现在电脑基本都是多核CPU,不同的线程可能运行的不同的核上,而每个核都会有自己的缓存空间。
volatile的出现,就是为了解决线程间不可见性,通过 volatile 修饰的变量,都会变得线程间可见。
解决多线程不可见的方式就是:
(1) 可见性
任意一个线程修改了 volatile 修饰的变量,其他线程可以马上识别到最新值。实现可见性的原理如下。
(2) 互斥性
同一时刻只允许一个线程操作 volatile 变量,volatile 修饰的变量在不加锁的场景下也能实现有锁的效果,类似于互斥锁。上面的 VolatileFeaturesA.java 和下面的 VolatileFeaturesB.java 两个类实现的功能是一样的(除了 getAndAdd 方法)。
(3) 部分有序性
JVM 是使用内存屏障来禁止指令重排,从而达到部分有序性效果,了解到内存屏障类型,我们就可以解决那些因重排序引起的有序性问题。
什么是内存屏障呢?内存屏障其实就是一个CPU指令,在硬件层面上来说可以扥为两种:Load Barrier 和 Store Barrier即读屏障和写屏障。主要有两个作用:
在JVM层面上来说作用与上面的一样,但是种类可以分为四种:
实现有序性的原理:
如果属性使用了 volatile 修饰,在编译的时候会在该属性的前或后插入内存屏障来禁止指令重排。
首先一个变量被volatile关键字修饰之后有两个作用:
当前名称:Java 开发实战—一起来认识volatile机制
文章URL:http://www.mswzjz.com/qtweb/news30/207730.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联