【发布时间】:2015-02-24 14:34:11
【问题描述】:
您将在下面看到的代码试图实现以下目标:
- 将“第 0 行”添加到数组列表中
- 打印数组列表中的最后一项,即“第 0 行”
从数组列表中删除最后一项
将“第 1 行”添加到数组列表中
- 打印数组列表中的最后一项,即“第 1 行” 从数组列表中删除最后一项
...等等没有尽头。
所以,我期望的输出很简单:
第 0 行
第 1 行
..
..
但是,我得到的是随机数量的“i 行”,其中 i 也是随机的。 这是一个示例输出:
第 0 行
第 38919 行
第 47726 行
第 54271 行
然后程序陷入似乎是死锁的状态,即使这没有意义,因为变量 'held' 只能是真或假,并且任何一种情况都应该允许其中一个线程执行工作。
import java.util.*;
public class Test {
static boolean held = true;
static ArrayList<String> line = new ArrayList<>();
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
int i = 0;
while(true) {
if(held) {
line.add("Line " + i);
i++;
held = false;
}
}
}
}.start();
while(true) {
if(!held) {
System.out.println( line.get(line.size() - 1) );
line.remove(line.size() - 1);
held = true;
}else continue;
}
}
}
【问题讨论】:
-
我在ideone上运行了这个,输出如你所愿。所以这一定是一些平台相关的问题。尝试将
volatile添加到持有的变量中。 -
您可以尝试使用
Semaphore -
@Martijn Courteaux 让 'held' volatile 成功了,谢谢!
-
@VGR“允许编译器重新排序任一线程中的指令,只要这不影响单独执行该线程” - 现在解释了我的程序的行为,谢谢!跨度>
标签: java multithreading arraylist