Итак, я работаю над конкурсом скорости на Java. У меня есть (количество процессоров) потоков, которые работают, и все они должны добавить к двоичному дереву. Первоначально я просто использовал синхронизированный метод добавления, но я хотел сделать так, чтобы потоки могли следовать друг за другом через дерево (каждый поток имеет только блокировку объекта, к которому он обращается). К сожалению, даже для очень большого файла (48 000 строк) мое новое двоичное дерево медленнее старого. Я предполагаю, что это потому, что я получаю и отпускаю блокировку каждый раз, когда я двигаюсь в дереве. Это лучший способ сделать это или есть лучший способ?Перемещение двоичного дерева с несколькими потоками
Каждый узел имеет блокировку с именем ReentrantLock и getLock() и releaseLock(), просто вызывает lock.lock() и lock.unlock();
Мой код:
public void add(String sortedWord, String word) {
synchronized(this){
if (head == null) {
head = new TreeNode(sortedWord, word);
return;
}
head.getLock();
}
TreeNode current = head, previous = null;
while (current != null) {
// If this is an anagram of another word in the list..
if (current.getSortedWord().equals(sortedWord)) {
current.add(word);
current.releaseLock();
return;
}
// New word is less than current word
else if (current.compareTo(sortedWord) > 0) {
previous = current;
current = current.getLeft();
if(current != null){
current.getLock();
previous.releaseLock();
}
}
// New word greater than current word
else {
previous = current;
current = current.getRight();
if(current != null){
current.getLock();
previous.releaseLock();
}
}
}
if (previous.compareTo(sortedWord) > 0) {
previous.setLeft(sortedWord, word);
}
else {
previous.setRight(sortedWord, word);
}
previous.releaseLock();
}
EDIT: Просто для уточнения, мой код структурирована следующим образом: Основной поток читает данные из файла и добавляет слова в очереди, каждый рабочий поток тянуть слова из очереди и выполняет некоторую работу (включая их сортировку и добавление в двоичное дерево).
Одно небольшое предложение: вместо потоков NumberOfProcessors вы можете вычесть их из-за того, что ОС будет использовать по крайней мере один из них, определяя поток на один процессор, что в значительной степени гарантирует некоторые служебные данные для обмена контекстом. – CPerkins
Я понял, что все будет хорошо, потому что небезосновательно предположить, что потоки будут ждать друг друга много. –
Если они ждут друг друга, это не хорошо, потому что они не работают. –