Я предполагаю эти ReentrantLock
, мотивирован рекурсивным обходом дерева:
public void doSomething(Node node) {
// Acquire reentrant lock
... // Do something, possibly acquire write lock
for (Node child : node.childs) {
doSomething(child);
}
// Release reentrant lock
}
разве Вы не можете осуществить рефакторинг свой код для перемещения обработки блокировки за пределами рекурсии?
public void doSomething(Node node) {
// Acquire NON-reentrant read lock
recurseDoSomething(node);
// Release NON-reentrant read lock
}
private void recurseDoSomething(Node node) {
... // Do something, possibly acquire write lock
for (Node child : node.childs) {
recurseDoSomething(child);
}
}
@Eric Lippert Хороший комментарий, но кроме того в ответе на вопрос:
, Какой объект у Вас было бы это, Вы не должны изменять значения в какой-то момент? Я предполагаю не образцовый класс, корректный? Я должен был изменить имя человека в моей базе данных - это не соответствовало бы этой идее.
Скажем, у Вас есть большой datastructure, и Вы хотите запросить его информацию, но он изменяется все время. Вам нужна некоторая запирающая система, чтобы удостовериться, что, поскольку Вы не говорите, пытаются считать общее количество в системе, в то время как кто-то вносит что-то от одного места до другого. (Скажите систему управления хранилищем)
И это трудно сделать, потому что эти вещи всегда влияют на вещи неожиданными способами, данные, изменяющиеся под Вашими ногами.
, Что, если Вы могли бы заморозить свой большой datastructure, когда Вы не обновляете его, так, чтобы никакая память не могла быть изменена и это приостанавливается в согласованном состоянии? Теперь то, когда Вы хотите изменить его снова, необходимо скопировать datastructure в новое место, и это является довольно большим, таким образом, это - оборотная сторона, но позитивный аспект - Вы, ничего не должно будет блокировать, потому что новая копия данных идет неразделенная, пока это не было обновлено. Это означает, что любой в любой точке может прочитать последнюю копию datastructure, делая сложные вещи.
Так да очень полезное понятие, если Вы очень не хотите заниматься проблемами параллелизма и не имеете слишком большого количества данных для контакта с. (Например, если 1 МБ данных и обновления 10/секунда это составляет 10 МБ скопированных данных)