我有4个线程同时填充一个50000000x4矩阵。为了确保写入安全,我使用了一个AtomicInteger作为指针。每个迭代每个线程将指针值复制到threadPointer并使用它填充。 获得指针== buffer.length的第一个线程启动一个例程以将缓冲区刷新到内存中。此时的其他线程应等待线程完成其工作。 这是我的代码:在java中唤醒等待线程
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()
不会唤醒等待我threads.How可以解决这一问题?
您的'wait'调用没有使用[guarded blocks](https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html)。这允许竞争条件,即如果一个线程将要到达'wait'调用但还没有,另一个线程过早地调用'notifyAll',导致它永远等待。 –
我明白了。我发现我的代码有一个导致意外行为的错误。其中之一导致线程调用notifyAll(),然后我期望导致你写的内容。谢谢。 – Aalto