Однако (если я действительно понимаю различие между этими методами право), только один поток всегда выбирается для дальнейшего приобретения монитора.
, Который не корректен. o.notifyAll()
следы весь из потоков, которые заблокированы в o.wait()
вызовы. Потокам только позволяют возвратиться от o.wait()
один за другим, но каждый из них будет получать их очередь.
Проще говоря, это зависит от того, почему Ваши потоки ожидают, чтобы быть уведомленными. Вы хотите сказать одному из потоков ожидания, что что-то произошло, или Вы хотите сказать всем им одновременно?
В некоторых случаях, все потоки ожидания могут принять полезные меры, как только ожидание заканчивается. Примером был бы ряд потоков, ожидающих определенной задачи закончиться; как только задача закончилась, все потоки ожидания могут продолжить свой бизнес. В таком случае Вы использовали бы notifyAll () для пробуждения всех потоков ожидания одновременно.
Другой случай, например, взаимоисключающая блокировка, только один из потоков ожидания может сделать что-то полезное, будучи уведомленным (в этом случае получают блокировку). В таком случае Вы использовали бы , уведомляют () . Правильно реализованный, Вы могли использование notifyAll () в этой ситуации также, но Вы излишне разбудите потоки, которые ничего не могут сделать так или иначе.
<час>Во многих случаях, код для ожидания условия будет записан как цикл:
synchronized(o) {
while (! IsConditionTrue()) {
o.wait();
}
DoSomethingThatOnlyMakesSenseWhenConditionIsTrue_and_MaybeMakeConditionFalseAgain();
}
Тот путь, если o.notifyAll()
вызов будит больше чем один поток ожидания и первый для возврата из эти o.wait()
, делает листы условием в ложном состоянии, то другие потоки, которые были пробуждены, вернутся к ожиданию.
Я думаю, вы переопределяете неправильный метод. Попробуйте использовать OnActionExecuting или OnActionExecuted.
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (something == true)
filterContext.Result = RedirectToAction("DoSomething", "Section");
else
base.OnActionExecuting(filterContext);
}
Я не уверен, что это то, что вы хотите, но попробуйте следующее:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
if (something == true)
RedirectToAction("DoSomething", "Section");
else
base.Initialize(requestContext);
}