Dzi*_*gas 4 java multithreading arraylist
您将在下面看到的代码尝试实现以下功能:
从arraylist中删除最后一项
将"第1行"添加到arraylist中
......等等没有尽头.
所以,我期望的输出只是:
第0行
第1行
..
..
然而,我得到的是随机数量的"行i",其中我也是随机的.这是一个示例输出:
第0行
38919行
47726行
第54271行
然后程序陷入似乎死锁的状态,即使这没有意义,因为变量'hold'只能是true或false,并且这些情况之一应该允许其中一个线程工作.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
可能你的held变量不是volatile导致死锁的事实.计算机上的不同核心将拥有自己的内存缓存,这些缓存不一定同时更新.要确保所有线程都可以看到对保持的更改,您应该使其变得不稳定.您还可以使用AtomicBoolean,或同步访问代码块.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |