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赋值操作
2 回答
噜噜哒
TA贡献1784条经验 获得超7个赞
我选D,单线程里面的整型变量和布尔变量可能会发生重排序,且对他们没有影响,而volatile是多线程的并发保证,保证了可见性,因而我选择存在逻辑先后的判断与赋值
陪伴而非守候
TA贡献1757条经验 获得超8个赞
此外,Java的内存模型具备一些天生的有序性规则,不需要任何同步手段就能够保证有序性,这个规则被称为Happens-before原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就无法保证有序性,也就是说虚拟机或者处理器可以随意对它们进行重排序处理。
下面我们来具体看看都有哪些happens-before原则。
· 程序次序规则:在一个线程内,代码按照编写时的次序执行,编写在后面的操作发生于编写在前面的操作之后。
· volatile变量规则:对一个变量的写操作要早于对这个变量之后的读操作。
...
添加回答
举报
0/150
提交
取消