我有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