问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中的volatile关键是什么作用?怎么使它

发布网友 发布时间:2022-04-23 06:32

我来回答

1个回答

热心网友 时间:2023-09-01 08:35

volatile关键字有什么用?
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:
int i1; int geti1() {return i1;}
volatile int i2; int geti2() {return i2;}
int i3; synchronized int geti3() {return i3;}

geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以互不相同。换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。
而geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
既然volatile关键字已经实现了线程间数据同步,又要synchronized干什么呢?呵呵,它们之间有两点不同。首先,synchronized获得并释放监视器——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。因此,执行geti3()方法做了如下几步:
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放)
2. 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗])
3. 代码块被执行
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值)
5. 线程释放监视this对象的对象锁
因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何查被录取到的专业 怎样查被录取的专业 录取后怎样查询录取的专业 录取专业怎么查 已被录取怎么查专业 ghs网络语什么意思_ghs网络语意思出处含义介绍 纸箱企业管理软件 ghs什么意思网络(ghs什么意思网络用语) 《喜羊羊与灰太狼》大结局 0与任何数相加都得原数吗? 搜索加好友,每天限制多少? volatile这个关键字有什么作用 Java:volatile的作用是什么呢?我的理解正确吗? 一个最多能加多少个好友? java中对象或者数组用volatile修饰有什么用 定义为volatile的变量有什么作用 一个每天最多可以加多少好友? 为什么我的电脑鼠标有时候在移动的时候突然不动过一会又好了 电脑的鼠标玩的时候就移不动了 是怎么回事? 电脑鼠标不动了、鼠标是好的、是什么原因啊?、 电脑经常出现鼠标灯亮着,但却移不动~这是为什么? 电脑系统正常就是鼠标不能动了,是什么原因? 海思990 5G与海思990+巴龙5000有什么区别? 电脑USB接口有电 为什么鼠标不能动 鼠标是好的 电脑开机后,鼠标不能动,请问怎么处理?鼠标是好的 电脑鼠标能点,移不动,怎么回事?求解 电脑鼠标有时候会突然失灵动不了或者移的有延迟,但是鼠标按键什么的都可以就是移不动。 鼠标是好的,但是电脑上面移不动是怎么回事? 电脑鼠标有电但移不动也点不动,咋办 最近开始看关于pyqt的内容 请问 pyqt4,python,QtDesigner,Eric4 他们... static和volatile有哪些用途用途。 volatile关键字在Java中有什么作用? 简述volatile关键字的作用是什么,并说明实际使用的场合有哪些 描述static, final, synchronized, volatile的作用 volatile 可以用来修饰函数返回值吗 长沙5号地铁经过哪些站? c代码中volatile关键字的作用,除了阻止cpu直接使用寄存器和cache中变量,还有其他功能吗? 长沙地铁末班车是几点? volatile关键字的作用是什么? 长沙地铁站几点开门? java多线程处理问题时,定义一个volatile修饰的变量来记录线程数,有什么作用呢。 长沙地铁哪一条到湖南省博物馆? 长沙地铁有几条线 长沙地铁几点运营 长沙地铁一号线站点名称是什么? 长沙地铁运营时间是多久? 长沙 地铁 一号线 有哪些站点? 长沙地铁6号线的站点设置在哪?全长多少公里? 长沙地铁有几条线? 长沙城轨站点有哪些?