使用volatile变量后,符合happens-before规则的是哪个?

发布于 2022-09-07 19:32:47 字数 459 浏览 15 评论 0

public class TestClass {

int i = 0;
volatile boolean tmpvo = false;
public void one() {
    i = 1; // 整型变量
    tmpvo = true; // 布尔变量
}
public void two() {
    if(tmpvo) { // 判断操作
        int j = i; // 赋值操作
        //......
    }
}

}
假设one()方法被线程1执行之后,方法two()被线程2执行,下面哪个符合happens-before的规则?单选
A、整型变量happens-before赋值操作
B、布尔变量happens-before判断操作
C、整型变量happens-before布尔变量
D、判断操作happens-before赋值操作

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

苏别ゝ 2022-09-14 19:32:47

感觉应该选C

謸气贵蔟 2022-09-14 19:32:47

我选D,单线程里面的整型变量和布尔变量可能会发生重排序,且对他们没有影响,而volatile是多线程的并发保证,保证了可见性,因而我选择存在逻辑先后的判断与赋值

败给现实 2022-09-14 19:32:47

显然是B啊,这不正是volatile的作用吗

冰雪之触 2022-09-14 19:32:47

volatile变量的写操作happen-before读操作,选B

_失温 2022-09-14 19:32:47

此外,Java的内存模型具备一些天生的有序性规则,不需要任何同步手段就能够保证有序性,这个规则被称为Happens-before原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就无法保证有序性,也就是说虚拟机或者处理器可以随意对它们进行重排序处理。
下面我们来具体看看都有哪些happens-before原则。
· 程序次序规则:在一个线程内,代码按照编写时的次序执行,编写在后面的操作发生于编写在前面的操作之后。
· volatile变量规则:对一个变量的写操作要早于对这个变量之后的读操作。
...

摘自:《Java高并发编程详解:多线程与架构设计》 — 汪文君

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文