我的程序有一个条件是无死锁的。ResourceManager 允许客户端
(Set<ResourceNames, long ID>)
写入/读取(布尔值 true/false)。那是一种方法 static long getLock(Set<String> resources, boolean operation)
和 static void releaseLock(long ID)
。
所有资源都是1-1。如果资源正在写入,则该资源不适用于另一个目标。如果用于读取,其他客户端只能读取,不能写入。资源名称是字符串。虽然 ResourceManager 不能为客户端提供资源,但它必须在 getlock() 方法中阻塞并在资源可供客户端使用时返回。
getlock()方法是获取资源,并创建一个ID,relaselock()方法是从ID中解放资源。我的任务是编写 ResourceManager,它不会死锁。
Client 类为随机操作和资源创建 k 个客户端,并启动它。那堂课是写的,但我看不到。我的任务是写一个类,和这两个方法。
-问题是阻止客户端并返回!- 死锁 - 免费
package itself.probafeladat14;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Random;
import java.util.Set;
public class ResourceManager {
protected static HashMap<String, Boolean> reservedResources =
new HashMap<String, Boolean>();
protected static HashMap<Long, Set<String>> resourcesByID =
new HashMap<Long, Set<String>>();
protected static LinkedList<Long> sequenceOfID =
new LinkedList<Long>();
public static void releaseLock(long ID) {
boolean read = false;
Set<String> resources = resourcesByID.remove(ID);
sequenceOfID.remove(ID);
for (String str : resources)
if (reservedResources.containsKey(str)) {
if (reservedResources.get(str) == true)
reservedResources.remove(str);
else if (reservedResources.get(str) == false) {
for (long i : sequenceOfID)
if (resourcesByID.get(i).contains(str))
read = true;
if (!read)
reservedResources.remove(str);
read = false;
}
}
}
public static long getLock(Set<String> resources, boolean operation) throws ResourceNotAvaliableException {
boolean isFree = true;
boolean uniqueID = false;
long ID = 0;
for (String str : resources) {
if (reservedResources.containsKey(str)) {
if (reservedResources.get(str) ) {
isFree = false;
}
if (reservedResources.get(str) == false &&
operation == true) {
isFree = false;
}
}
}
if ( !isFree )
throw new ResourceNotAvaliableException();
else {
for (String s : resources)
if (!reservedResources.containsKey(s))
reservedResources.put(s, operation);
while (!uniqueID) {
ID = new Random().nextLong();
if (!sequenceOfID.contains(ID))
uniqueID = true;
}
sequenceOfID.addLast(ID);
resourcesByID.put(ID, resources);
return ID;
}
}
}