可以(a == 1 \u0026\u0026 a == 2 \u0026
发布时间:2020-12-15 07:36:48 所属栏目:Java 来源:网络整理
导读:We know it can in JavaScript. 但是有可能在Java下面给出的条件下打
We know it can in JavaScript.
但是有可能在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声明为volatile,那么使用多个线程很容易实现.
一个线程不断地将变量a从1变为3,另一个线程不断测试a == 1&& a == 2&& a == 3.通常情况下,控制台上会打印出连续的“成功”流. (注意,如果你添加一个else {System.out.println(“Failure”);}子句,你会发现测试失败的次数远远超过它成功.) 在实践中,它也可以在没有声明为易失性的情况下工作,但在我的MacBook上只有21次.如果没有volatile,则允许编译器或HotSpot使用if(false)缓存或替换if语句.最有可能的是,HotSpot会在一段时间后启动并将其编译为汇编指令,这些指令会缓存a的值.挥发性,它永远保持印刷“成功”. 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(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |