我通过暂停做同样事情的线程等待其中一个完成来改进我的并发程序。但是,它不能正确唤醒线程。这是代码。
//to store graphs, if a thread finds the graph it is going to compute is in the entry, it waits, otherwise it compute then notify all other threads waiting on it.
Map<Graph, Object> entry = new ConcurrentHashMap<Graph, Object>();
public Result recursiveMethod(Graph g) {
if (entry.get(g) != null) {//if the graph is in the entry, waits
synchronized(entry.get(g)) {
entry.get(g).wait();
}
//wakes up, and directly return the result
return result;
}
synchronized(entry) {
if (entry.get(g) == null)//if the graph is not in the entry, continue to compute
entry.put(g,new Object());
}
//compute the graph recursively calls this method itself...
calculate here...
//wake up threads waiting on it, and remove the graph from entry
synchronized(entry.get(g)){
entry.get(g).notifyAll();
}
entry.remove(g);
return result;
}
该方法被许多线程调用。在线程开始计算之前,它会查找条目以查看是否有另一个线程在计算相同的图。如果是这样,它会等待。如果没有,它会继续计算。在计算出结果后,它会通知所有正在等待它的线程。
我使用地图来配对图形和对象。对象是锁。请注意,这张图可以识别两个相同的图,即下面的代码返回true。
Graph g = new Graph();
entry.put(g, new Object());
Graph copy = new Graph(g);
entry.get(g) == entry.get(copy) //this is true
因此,entry.get(g) 应该可以作为锁/监视器。但是,大部分线程还没有被唤醒,只有 3-4 个线程。当等待的线程数等于我的计算机可以创建的线程数时,这意味着所有线程都在等待,这个程序永远不会终止。
为什么 entry.get(g).notifyAll() 不工作?