Варианты использования для Java параллельные утилиты

(Обновленный для полноты)
Вы можете получить доступ к переменным сеанса от любой страницы или управления с помощью 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;

Этот подход имеет несколько преимуществ:

  • это сохраняет Вас от большого преобразования типа
  • , Вы не должны использовать трудно кодированные сеансовые ключи всюду по своему приложению (например, сессия ["loginId"]
  • , можно зарегистрировать объекты сессии путем добавления, что документ XML комментирует свойства MySession
  • , можно инициализировать переменные сеанса со значениями по умолчанию (например, уверение, они не являются пустыми)
5
задан parkr 4 September 2009 в 02:44
поделиться

2 ответа

  • Зачем использовать параллельную коллекцию вместо синхронизированной?

Потому что синхронизированная коллекция защищает только данные от повреждения из-за одновременного доступа. Это не означает, что синхронизированные коллекции оптимизированы для одновременного доступа. На самом деле это далеко не так - ConcurrentMap.putIfAbsent является гораздо лучшим механизмом для compareAndSet , чем блокировка всей Map для чтения.

  • Когда следует атомарные классы предпочтительнее явной блокировки?

Классы AtomicInteger и AtomicLong всегда следует использовать (на мой взгляд), а не ручную блокировку с примитивом, потому что они более краткие . Подумайте:

synchronized (lock) { 
    int old = counter;
    counter++;
    return old;
}

По сравнению с:

int old = counter.getAndIncrement();

Я должен сказать, что, что классы страдают от отсутствия ожидания . Например, вам часто нужно какое-то синхронизированное логическое значение, в котором вы ждете логического условия. Они были доступны как WaitableBoolean в старой библиотеке параллелизма Дуга Ли, но они были исключены в juc , я не уверен, почему.

  • Когда следует использовать блокировки вместо синхронизации?

Это более сложный вопрос, потому что использование Блокировок сопряжено с некоторыми накладными расходами. Фактически, часто говорят, что нет ничего плохого в использовании ReadWriteLock в типичных случаях. Один сценарий , где должны использоваться блокировки , - это когда блокировка ресурса и его разблокировка не могут выполняться в одной и той же лексической области . synchronized бессилен помочь в подобных случаях.

  • Каковы альтернативы wait () и notify (), notifyAll ()?

await , signal и signalAll

  • Когда следует использовать CompletionService?

Служба завершения полезна в случае, когда к потреблению результата вычисления не требуется доступ в точке, где вычисление было отправлено, но где важно , чтобы завершение вычисления (или его результат, или успех) будут известны вашей программе. Это может быть, например, для отслеживания доли невыполненных задач (которые вызывают исключения) или для очистки ресурсов.

signal и signalAll

  • Когда следует использовать CompletionService?

Служба завершения полезна в случае, когда нет необходимости получать доступ к результату вычисления в точка вычисление было отправлено, но где важно , чтобы ваша программа знала о завершении вычисления (или его результат, или успех). Это может быть, например, для отслеживания доли невыполненных задач (которые вызывают исключения) или для очистки ресурсов.

signal и signalAll

  • Когда следует использовать CompletionService?

Служба завершения полезна в том случае, когда нет необходимости получать доступ к результату вычисления в точка вычисление было отправлено, но где важно , чтобы ваша программа знала о завершении вычисления (или его результате, или успехе). Это может быть, например, для отслеживания доли невыполненных задач (которые вызывают исключения) или для очистки ресурсов.

11
ответ дан 18 December 2019 в 14:48
поделиться
What are the alternatives to wait() and notify(), notifyAll()

Одна очень хорошая альтернатива wait (), notify () и notifyAll () - это ] НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ИХ .

Кодовая база 200KLOC здесь, то есть сильно многопоточная. Мы распределяем нагрузку на бесчисленное количество ядер и используем схему армии производителей / потребителей и т. Д.

Экземпляры wait (), notify () или notifyAll () в нашем коде ?

Ноль.

Я снова акцентирую внимание на том факте, что это сильно многопоточное приложение: * защелки, отравляющие таблетки, java.util.concurrent. ** и еще много чего везде . Но wait (), notify () или notifyAll () : ноль экземпляров.

Это на самом деле низкоуровневый материал, который должен использоваться только в утилитах / фреймворках параллелизма.

От Джошуа Блоха, в «Эффективная Java» , в самом начале главы «Потоки» :

«Если есть библиотека, которая может спасти вас от выполняя низкоуровневое многопоточное программирование, обязательно используйте его. "

2
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: