Я пишу здесь модифицированную систему Kademlia P2P, но проблема, которую я здесь описываю, очень похожа на реализацию оригинальной.
Итак, каков наиболее эффективный способ реализации k-Buckets? Для меня важны время доступа, параллелизм (чтение и запись) и потребление памяти.
Думал делать это с ConcurrentLinkedQueue и ConcurrentHashMap, но это довольно избыточно и противно, не так ли?
На данный момент я просто синхронизирую LinkedList.
Вот мой код:
import java.util.LinkedList;
class Bucket {
private final LinkedList<Neighbour> neighbours;
private final Object lock;
Bucket() {
neighbours = new LinkedList<>();
lock = new Object();
}
void sync(Neighbour n) {
synchronized(lock) {
int index = neighbours.indexOf(n);
if(index == -1) {
neighbours.add(n);
n.updateLastSeen();
} else {
Neighbour old = neighbours.remove(index);
neighbours.add(old);
old.updateLastSeen();
}
}
}
void remove(Neighbour n) {
synchronized(lock) {
neighbours.remove(n);
}
}
Neighbour resolve(Node n) throws ResolveException {
Neighbour nextHop;
synchronized(lock) {
int index = neighbours.indexOf(n);
if(index == -1) {
nextHop = neighbours.poll();
neighbours.add(nextHop);
return nextHop;
} else {
return neighbours.get(index);
}
}
}
}
Пожалуйста, не удивляйтесь, я реализовал еще один процесс выселения соседей.