加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

关于volatile关键字的“Java Threads”一书的引用

发布时间:2020-12-15 05:19:40 所属栏目:Java 来源:网络整理
导读:我只是想知道是否有人可以解释这个含义: Operations like increment and decrement (e.g. ++ and -- ) can’t be used on a volatile variable because these operations are syntactic sugar for a load,change and a store. 我认为增量和减量应该适用于一
我只是想知道是否有人可以解释这个含义:

Operations like increment and
decrement (e.g. ++ and --) can’t be
used on a volatile variable because
these operations are syntactic sugar
for a load,change and a store.

我认为增量和减量应该适用于一个易变量变量,唯一的区别是每次你读或写时你都会从主内存访问/写入而不是从缓存中访问.

解决方法

Java语言规范没有和 – 运算符的原子操作.换句话说,当您以下列方式编写代码时:

a++;

Java编译器实际上发出的代码类似于下面的一组步骤(实际指令将根据变量的性质而变化):

>使用其中一个加载数据的操作将操作数加载到堆栈中.
>复制堆栈上操作数的值(以便稍后返回).这通常使用dup操作完成.
>增加堆栈上的值.通常使用VM中的iadd操作完成.
>返回值(在步骤2中获得).

正如您所看到的,VM中有多个操作通常被认为是原子操作. VM可以确保原子性仅达到单个操作的级别.任何进一步的要求只能通过同步或其他技术来实现.

使用volatile关键字,允许其他线程获取变量的最新值;对变量的所有读取操作都将基于每个指令返回最近更新的值.例如,如果变量a在前一个示例中是易变的,那么读取a的值的线程如果要读取指令2之后和指令3之后将看到不同的值.使用volatile不能防止这种情况发生场景.它可以防止多个线程看到后续指令2(例如)的多个值的情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读