我们知道它可以在 JavaScript 中 https://stackoverflow.com/q/48270127/476716.
但是在Java中是否可以在下面给出的条件下打印“成功”消息?
if (a==1 && a==2 && a==3) {
System.out.println("Success");
}
有人建议:
int _a = 1;
int a = 2;
int a_ = 3;
if (_a == 1 && a == 2 && a_ == 3) {
System.out.println("Success");
}
但通过这样做,我们正在改变实际变量。还有其他办法吗?
是的,如果你声明变量,用多个线程实现这一点很容易a
作为挥发性的。
一个线程不断地将变量 a 从 1 更改为 3,另一个线程不断测试该变量a == 1 && a == 2 && a == 3
。这种情况经常发生,控制台上会连续打印出“成功”信息。
(请注意,如果您添加else {System.out.println("Failure");}
子句,您会发现测试失败的次数远多于成功的次数。)
实际上,它也可以在不声明的情况下工作a
不稳定,但在我的 MacBook 上只有 21 次。没有volatile
,允许编译器或HotSpot缓存a
或更换if
声明与if (false)
。最有可能的是,HotSpot 会在一段时间后启动并将其编译为汇编指令,这些指令会缓存a
. With volatile
,它永远打印“成功”。
public class VolatileRace {
private volatile int a;
public void start() {
new Thread(this::test).start();
new Thread(this::change).start();
}
public void test() {
while (true) {
if (a == 1 && a == 2 && a == 3) {
System.out.println("Success");
}
}
}
public void change() {
while (true) {
for (int i = 1; i < 4; i++) {
a = i;
}
}
}
public static void main(String[] args) {
new VolatileRace().start();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)