Практически любой вид рекурсивного кода может быть классифицирован как реентерабельный (т. Е. Вы можете перезвонить в тот же метод, не завершив его), но он используется , в частности , когда речь идет о блокировках, мьютексах, семафорах и т. д. Например, блокировка является повторной, если если у вас есть блокировка , вы можете снова успешно «заблокировать» код (т. е. не блокировать себя самостоятельно) - например:
public void AddIfNecessary(string s) {
lock(syncObj) {
if(!Contains(s)) Add(s);
}
}
public void Add(string s) {
lock(syncObj) {
list.Add(s);
}
}
public bool Contains(string s) {
lock(syncObj) {
return list.Contains(s);
}
}
Здесь тот факт, что блокировка является входящей, означает, что мы можем вызывать Contains
и Add
, не беспокоясь о том, что у нас уже есть «эксклюзивная» блокировка, что делает код более простым. Внутренне используется счетчик, а не простой флаг «в использовании».