volatile测试问题
运行下面的代码,按预期结果应该是:52,但是返回结果是 0
public class MyVolatile {
private volatile static boolean[] account;
public static void main(String[] args) {
//1 init
account = new boolean[100];
Arrays.fill(account, false);
//2 iterate
ArrayList<Thread> arrayList = new ArrayList<Thread>();
for (int i = 0; i < 52; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < account.length; j++) {
System.out.println(Thread.currentThread() + " - " + j + ":" + account[j]);
if (account[j] == false) {
account[j] = true;
return;
}
}
System.out.println("no --- " + Thread.currentThread());
}
});
arrayList.add(thread);
}
for (Thread thread : arrayList) {
thread.start();
}
//3 end
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int total = 0;
for (int j = 0; j < 100; j++) {
total = account[j] ? total + 1 : 0;
}
System.out.println("finally:" + total);
}
}
为什么?为什么account数组里面全都是false?
如果把account数组的长度修改为52的话,结果total为:52。
当account数组的长度大于线程数时,结果总是为0。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
后面的都是
false
,直接给total
赋值0
了你和隔壁的 https://segmentfault.com/q/10... 是一个人好几个小号么?问题差不多然而是两个人?