【发布时间】:2016-09-24 03:38:06
【问题描述】:
我有 4 个线程同时填充 50000000x4 矩阵。为了确保写入的安全性,我使用了 AtomicInteger 作为指针。每次迭代每个线程将指针值复制到 threadPointer 并使用它来填充 . 获得指针 == buffer.length 的第一个线程启动例程将缓冲区刷新到内存中。此时其他线程应等待线程完成其工作。 这是我的代码:
if ((threadPointer = pointer.getAndAdd(1)) >= buffer.length ){
synchronized (flag){
if(threadPointer == buffer.length){
sampledSelection();
pointer.set(0);
threadPointer = pointer.getAndAdd(1);
flag.notifyAll();
}else{
System.out.println("waiting");
flag.wait();
threadPointer = pointer.getAndAdd(1);
System.out.println("Awaken!");
}
}
}
我的问题是notifyAll() 没有唤醒等待的线程。我该如何解决这个问题?
【问题讨论】:
-
您没有在您的
wait呼叫中使用guarded blocks。这允许竞争条件,即如果一个线程将到达wait调用但还没有,而另一个线程调用notifyAll太快,导致它永远等待。 -
我明白了。我发现我的代码有一个导致意外行为的错误。其中之一导致线程调用 notifyAll() 在我预期会导致您写的内容之前。谢谢。
标签: java multithreading wait