私のプログラムには、デッドロックが発生しない条件があります。ResourceManager は、クライアントに
(Set<ResourceNames, long ID>)
書き込み/読み取りを許可します (ブール値の true/false)。それはメソッド static long getLock(Set<String> resources, boolean operation)
であり、 static void releaseLock(long ID)
.
すべてのリソースは 1-1 です。リソースが書き込みに使用されている場合、そのリソースは別のターゲットには適用されません。読み取りの場合、他のクライアントは読み取りのみを取得できますが、書き込みはできません。リソース名は Strings です。ResourceManager はクライアントのリソースを特定できませんが、getlock() メソッドでブロックし、リソースがクライアントで使用可能になったときに戻る必要があります。
getlock() メソッドはリソースをエンゲージして ID を作成し、relaselock() メソッドは ID からリソースを解放します。私の仕事は、ResourceManager を作成することであり、デッドロックが発生しません。
Client クラスは、ランダムな操作とリソース用に k 個のクライアントを作成し、これを開始します。そのクラスは書かれていますが、私はそれを見ることができません。私の仕事は、クラスとこれら 2 つのメソッドを作成することです。
- そして問題は、クライアントをブロックして返すことです! -デッドロック - 無料
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;
}
}
}