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

可以(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();
    }
}

(编辑:李大同)

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

    推荐文章
      热点阅读