JAVA多线程技术学习笔记——volatile关键字解析

本文详细解析了JAVA中的volatile关键字,介绍了其两大作用:禁止指令重排以保证有序性,以及确保操作的可见性。同时,文章讨论了volatile在多线程中的应用,指出它无法保证原子性,并不能确保线程安全。 volatile修饰数组和对象时,仅对引用本身可见,不影响数组元素或对象内部的状态。
摘要由CSDN通过智能技术生成

 

JAVA多线程技术学习笔记——volatile关键字解析

 

一、volatile关键字的作用

volatile关键字的作用主要有两个确保有序性禁止指令重排,确保可见性。简单的来说就是保护变量不被主函数和中断函数反复修改造成读写错误

 

1.禁止指令重排

a)什么是指令重排

我们知道,代码的执行顺序一般来说是从上之下,即拥有我们所称之为有序性。看下面一段代码:

int i = 0;              
boolean flag = false;
i = 1;                //语句1  
flag = true;          //语句2

通常语句1是在语句2前面的,但是JVM在真正是按照这样的顺序运行的吗?其实并不一定,因为JVM可能会对代码进行指令重排。所谓的指令重排就是由于处理器为了提高运行效率可能会在确保输出结果与代码按顺序执行的结果相同的前提下调整代码的运行顺序从而优化代码。语句1和语句2谁先执行对最终的程序结果并没有影响,那么就有可能在执行过程中,语句2先执行而语句1后执行。但是要注意,虽然处理器会对指进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同,那么它靠什么保证的呢?这里就要引入一个原则——happens-before原则,只要符合该原则的代码都不能调换顺序具有依赖性,不符合的代码就可能进行指令重排。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值