无限循环java结束关键字,Java,可见性和无限循环发生

public class NoVisibility {

private static boolean ready;

private static int number;

private static class ReaderThread extends Thread {

public void run() {

while (!ready) {

Thread.yield();

System.out.println(number);

}

}

public static void main(String[] args) {

new ReaderThread().start();

number = 42;

ready = true;

}

}

此代码可能会打印0或永久循环.

虽然很容易理解为什么NoVisibility可以打印0而不是42(由于重新排序问题),

我对无限循环有点困惑.

在这段代码中,可能出现无限循环的实际场景是什么?

解决方法:

当ready设置为true时,循环停止.并且主线程将ready设置为true.但由于ready字段不是volatile,循环线程可能会继续看到缓存的值:false.

volatile关键字保证读取volatile字段的所有线程实际上都会看到任何其他线程存储在该字段中的最后一个值.没有挥发性,你没有这个保证.

标签:java,concurrency,thread-safety

来源: https://codeday.me/bug/20190726/1540462.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值