(Обновленный для полноты)
Вы можете получить доступ к переменным сеанса от любой страницы или управления с помощью Session["loginId"]
и от любого класса (например, из библиотеки классов), с помощью System.Web.HttpContext.Current.Session["loginId"].
, Но продолжаете читать для моего исходного ответа...
<час>я всегда использую класс обертки вокруг сессии ASP.NET для упрощения доступа к переменным сеанса:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Этот класс хранит один экземпляр себя на сессии ASP.NET и позволяет Вам получать доступ к своим свойствам сессии безопасным с точки зрения типов способом от любого класса, например, как это:
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
Этот подход имеет несколько преимуществ:
Потому что синхронизированная
коллекция защищает только данные от повреждения из-за одновременного доступа. Это не означает, что синхронизированные
коллекции оптимизированы для одновременного доступа. На самом деле это далеко не так - ConcurrentMap.putIfAbsent
является гораздо лучшим механизмом для compareAndSet
, чем блокировка всей Map
для чтения.
Классы AtomicInteger
и AtomicLong
всегда следует использовать (на мой взгляд), а не ручную блокировку с примитивом, потому что они более краткие . Подумайте:
synchronized (lock) {
int old = counter;
counter++;
return old;
}
По сравнению с:
int old = counter.getAndIncrement();
Я должен сказать, что, что классы страдают от отсутствия ожидания . Например, вам часто нужно какое-то синхронизированное логическое значение, в котором вы ждете
логического условия. Они были доступны как WaitableBoolean
в старой библиотеке параллелизма Дуга Ли, но они были исключены в juc
, я не уверен, почему.
Это более сложный вопрос, потому что использование Блокировок
сопряжено с некоторыми накладными расходами. Фактически, часто говорят, что нет ничего плохого в использовании ReadWriteLock
в типичных случаях. Один сценарий , где должны использоваться блокировки , - это когда блокировка ресурса и его разблокировка не могут выполняться в одной и той же лексической области . synchronized
бессилен помочь в подобных случаях.
await
, signal
и signalAll
Служба завершения полезна в случае, когда к потреблению результата вычисления не требуется доступ в точке, где вычисление было отправлено, но где важно , чтобы завершение вычисления (или его результат, или успех) будут известны вашей программе. Это может быть, например, для отслеживания доли невыполненных задач (которые вызывают исключения) или для очистки ресурсов.
signal
и signalAll
Служба завершения полезна в случае, когда нет необходимости получать доступ к результату вычисления в точка вычисление было отправлено, но где важно , чтобы ваша программа знала о завершении вычисления (или его результат, или успех). Это может быть, например, для отслеживания доли невыполненных задач (которые вызывают исключения) или для очистки ресурсов.
signal
и signalAll
Служба завершения полезна в том случае, когда нет необходимости получать доступ к результату вычисления в точка вычисление было отправлено, но где важно , чтобы ваша программа знала о завершении вычисления (или его результате, или успехе). Это может быть, например, для отслеживания доли невыполненных задач (которые вызывают исключения) или для очистки ресурсов.
What are the alternatives to wait() and notify(), notifyAll()
Одна очень хорошая альтернатива wait (), notify () и notifyAll () - это ] НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ИХ .
Кодовая база 200KLOC здесь, то есть сильно многопоточная. Мы распределяем нагрузку на бесчисленное количество ядер и используем схему армии производителей / потребителей и т. Д.
Экземпляры wait (), notify () или notifyAll () в нашем коде ?
Ноль.
Я снова акцентирую внимание на том факте, что это сильно многопоточное приложение: * защелки, отравляющие таблетки, java.util.concurrent. ** и еще много чего везде . Но wait (), notify () или notifyAll () : ноль экземпляров.
Это на самом деле низкоуровневый материал, который должен использоваться только в утилитах / фреймворках параллелизма.
От Джошуа Блоха, в «Эффективная Java» , в самом начале главы «Потоки» :
«Если есть библиотека, которая может спасти вас от выполняя низкоуровневое многопоточное программирование, обязательно используйте его. "