我有一个分配,其中有两个线程使用共享的单例类示例存储资源列表。当线程接收到事件时,他会尝试使用共享示例获取资源。一个资源是通过生成一个布尔字段来获取的,这个布尔字段表示他是否可以随意设置为false。问题是,如果一个线程正在使用另一个线程需要的资源,那么在等待第二个线程完成时,另一个线程将做什么?我所能想到的只是一个while循环,直到他获得了所需的所有资源才停止,但是它很忙,等待,我试着想一个不同的方法。
public class Thread1{
private SharedObject sharedObject;
public void acquire objects(List<Integer> indexes){
for(int i=0;i<indexes.size;i++){
sharedObject.acquire(indexes[i]);
}
}
}
// I have another Thread which is implemented the same way
public class SharedObject{
private List<SomeObject> someObjects;
public synchronized void acquire(int index){
someObjects[index].acquire();
}
}
public class SomeObject{
private boolean isFree = true;
public void acquire(){
isFree = False;
}
}
因此,我的问题是,如果其中一个资源在我试图获取它们时已经在使用,该怎么办
1条答案
按热度按时间8wigbo561#
声明具有同步的“boolean resourcewait()”的singleton类,该方法必须由需要任何一组资源的线程调用,并且必须在线程完成某组资源时调用“resourcerelease()”。它还需要一个初始为空的等待资源的线程示例的“等待”列表。
声明一个线程类,该类公开资源的公共列表和一个“resourcesavailable()方法,该方法向私有信号量发出信号”。
在'resourcewait'单例锁中,线程可以检查它是否可以立即获得所有资源,如果可以,则将它们标记为正在使用,使用'true'退出synchro方法并继续运行。如果线程不能立即获得所有的资源,它可以将自己加载到等待列表中,用'false'退出synchro方法,然后等待它的私有信号量。
当线程调用release时,它会将资源标志设置为“free”,并迭代“waiting”列表,寻找现在可以获得所需资源的线程。如果找到一个,它将为等待线程的资源设置'in use'标志,在等待线程上调用'resourcesavailable'(向其信号量发送信号,从而将其设置为ready/running),并退出syncro。
没有繁忙的等待循环,没有死锁,易于扩展/修改,易于调试。