【发布时间】:2011-12-18 22:17:52
【问题描述】:
有一个 n 线程可以访问的单例类。
每个线程都加载这个类的实例并循环调用这个类的一个方法。
我必须控制执行流程,以便每个线程都可以调用方法一并暂停,只有在所有线程调用该方法后,必须恢复它们的工作。 线程可以按任意顺序调用方法,只是它们都必须在移动循环之前执行一次方法。
这是我尝试做的:
在线程中:
while ( some condition){
ObjectType obj = theSingleton.getInstance().getSharedObject();
obj.SomeMethod(threadID);
if (obj.waitisneeded())
synchronized (obj ) {
obj.wait();
}
}
我在 SomeMethod 中做了什么:
public synchronized void SomeMethod(String threadID) {
hashMap.put(threadID,true);
some job here
}
需要等待:
public synchronized boolean waitisneeded(){
{
Iterator iter = hashMap.entrySet().iterator();
boolean alldone = false;
while (iter.hasNext()) {
Map.Entry me = (Map.Entry) iter.next();
String key = me.getKey().toString();
alldone = (Boolean)me.getValue();
if(!alldone) {
return false;
}
}
//set all values to false
iter = hashMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry me = (Map.Entry) iter.next();
String key = me.getKey().toString();
me.setValue(false);
}
this.notifyAll();
return true;
运行它给我带来了意想不到的结果和死锁。
我该如何解决?
注意:我不能改变线程的创建方式,我只能改变那些方法!!! (加上等待所在的线程中的while循环)
【问题讨论】:
-
你知道在每个调用
obj.SomeMethod()之前创建了多少个线程吗? -
你怎么知道“所有预期的线程现在都调用了单例”这一点已经达到了?
-
@TheScrumMeister Scrum Meister 是的,我知道线程数
-
@Thorbjørn Ravn Andersen,正如您在代码中看到的,在 getSharedObject 中有一个哈希图,我在其中标记了访问它的线程。当所有线程都检查时,我想释放线程并清除哈希图,以便它们可以重新开始。
标签: java multithreading thread-safety