有一个主线程有一个while循环,在此期间他检查某些条件,如果满足所有条件,他启动另一个线程进入wait()状态。
并行运行的其他线程在工作完成时通知主线程。
"子线程"存在问题通知主线程之前主线程进入等待状态=死锁。
避免它的最佳做法是什么?
答案 0 :(得分:1)
确保主线程不会等待已发生的事情。 (为什么有人会这样做呢?没有意义。)
答案 1 :(得分:0)
我更愿意使用Explicit Locks。请参阅Java Concurrent Api。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Lock.html
答案 2 :(得分:0)
使用信号量进行通知。
就是这样,真的。信号量有一个计数,可以记录通知,直到主线程到处等待它。
答案 3 :(得分:0)
简单的答案是使用Java 5中的并发包。这里的CountDownLatch似乎很合适。
如果您仅限于Java 5之前的环境,则必须创建使用相同算法的自定义实现。主线程将在创建所有子线程后调用signalReady。子线程在完成工作后会调用signalComplete。
一个简单的实现方法是让一个名为Latch的Object有两个两个成员字段。
以下实施适用于一个父母和一个孩子。对于额外的孩子,每个孩子都可以获得自己的闩锁,以便在完成时发出信号仍然会出现这种情况。在信令之间添加自旋锁或者睡眠可以减少竞争条件的可能性。 它不会消除它
class Latch{
Object readyLock;
Object completeLock;
public void signalComplete(){
synchronized(readyLock){
readyLock.wait()
}
//spin lock as a precaution
synchronized(completeLock){
completeLock.notify()
}
}
public void signalReady(){
synchronized(readyLock){
readyLock.notify()
}
synchronized(completeLock){
completeLock.wait()
}
}
}
希望这有帮助!
答案 4 :(得分:0)
几乎总是将wait()
方法放在while
循环中,其“迭代条件”是检查特定事件是否已发生,这是一种非常常见的做法,发生时,另一个线程会调用notify()
方法。
前:
while(!event_occurrence) {
...
wait();
...
}
其中event_occurrence
是另一个线程调用notify()
方法的事件。