Я пытаюсь стимулировать сценарий взаимоблокировок в разделяемом массиве с помощью Reentrant Locks.
class SharedArray {
private int ff[];
private Lock keys[];
public SharedArray(int n){
ff = new int[n];
keys = new ReentrantLock[n];
for(int j = 0; j < n; j++){
ff[j] = (int)(Math.random()*100);
keys[j] = new ReentrantLock();
}
}
void swap(int j, int k) {
keys[j].lock(); keys[k].lock();
int t = ff[j]; ff[j] = ff[k]; ff[k] = t;
keys[j].unlock(); keys[k].unlock();
}
}
Здесь метод обмена является тупиковым, которого я достиг. например, если поток 1 - это своп (7,4), и в то же время поток 2 - это своп (4,7), это вызовет тупик.
Как мне предотвратить его тупик. Какой рефакторинг требуется. Я пытался использовать синхронизированный, но я ищу, возможно, надежный способ решить эту проблему.
synchronized void swap(int j, int k) {
keys[j].lock(); keys[k].lock();
int t = ff[j]; ff[j] = ff[k]; ff[k] = t;
keys[j].unlock(); keys[k].unlock();
}