
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
volatile关键字是程序员在学习Java编程开发语言的时候需要重点掌握的一个编程开发知识点,而本文我们就简单了解一下,volatile关键字应用实践分析。
此关键字修饰的变量具有两种效果:1、保证线程间的可见性;2、阻止指令重排序
对于1的实现,它保证load与use必须相邻调用,即要use这个变量,必定先执行read/load,这样每次都能获取到新的变量值;它又保证asign与store必须相邻调用,即在工作内存中将该变量改了之后,必定会先同步到主内存中。这样,volatile关键字实现了可见性。
从另一个角度来分析,Java内存模型是围绕着在并发过程中如何处理原子性、可见性、有序性来建立的。
原子性:八个原子性操作,以及synchronized(lock/unlock未直接开放给用户,synchronized通过monitorenter跟monitorexit指令调用的lock/unlock操作)
可见性:volatile、synchronized、final这三个关键字均通过不同方式实现了可见性
有序性:volatile、synchronized这两个关键字保证有序性,同时还有先行发生(happens-before)原则来保证隐含的默认有序性
下面说说happens-before先行发生原则,先行发生原则用通俗语言表述就是:如果操作A在操作B之前发生,那么A产生的影响B同样能观测到。那么问题来了,先行发生原则都有哪些呢?同样有八条,如下:
程序次序规则:同一个线程中按照代码的顺序依次执行
管程锁定规则:对于同一个锁,unlock先行发生于后面的lock,即unlock了才会lock
volatile变量规则:对一个volatile变量的写操作先行发生于后面对该变量的读操作,即写完了才会读
线程启动规则:一个线程的start()方法先行发生于此线程的任何一个动作
线程终止规则:一个线程的所有动作先行发生于该线程的终止检测
线程中断规则:对一个线程interrupt()方法的调用先行发生于线程的中断检测Thread.interrpted()
对象终结规则:对象的初始化完成先行发生于finalize()方法
传递性:顾名思义,A先行发生于B,B先行发生于C,则A一定先行发生于C
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。