Какова стоимость энергозависимого ключевого слова в многопроцессорной системе?

В SpringMVC вы можете указать значения из строки запроса, которые будут проанализированы и переданы как параметры метода с аннотацией @RequestParam.

public ModelAndView getPage(
    @RequestParam(value="page", required=false) String page, 
    @RequestParam(value="gotoUrl", required = false) String gotoUrl) {
}
11
задан kolosy 16 June 2009 в 16:59
поделиться

5 ответов

lock does induce a memory barrier, so if you are always accessing instance in a lock you don't need the volatile.

According to this site:

The C# volatile keyword implements acquire and release semantics, which implies a read memory barrier on read and a write memory barrier on write.

4
ответ дан 3 December 2019 в 10:44
поделиться

В приведенном здесь примере volatile не должен вызывать "замедления". Однако lock () может включать в себя огромные циклы обращения к ядру, особенно если есть много конфликтов за блокировку.

В этом случае действительно нет необходимости блокировать ваш синглтон, вы можете просто do

class Foo {
  static Foo instance = new Foo();
  public static Foo FooInstance() {
    return instance ;
  }
}

Конечно, если 'instance' используется во множестве разных потоков, вам все равно придется lock () все, что изменяет этот Foo, если все методы / свойства Foo не доступны только для чтения. например,

 class Foo {
      static Foo instance = new Foo();
      object l = new object();
      int doesntChange = 42;
      int canChange = 123;
      public static Foo FooInstance() {
        return instance ;
      }
      public void Update(int newVal) {
         lock(l) { // you'll get a lot of trouble without this lock if several threads accesses the same FOO. Atleast if they later on read that variable 
            canChange = newVal;
         }

      public int GetFixedVal() {
         return doesntChange; //no need for a lock. the doesntChange is effectivly read only
      }
    }
0
ответ дан 3 December 2019 в 10:44
поделиться

К сожалению, синглтон плохо относится почти ко всему :)

Это не моя область знаний, но, насколько мне известно, в volatile нет ничего особенного, кроме компилятора / времени выполнения, НЕ переупорядочивающего чтение / запись (в переменную) в целях оптимизации.

Изменить: Я исправился. Энергозависимость не только создает барьеры для памяти, но и то, что происходит (и, кстати, производительность), во многом зависит от конкретного процессора. См. http://dotnetframeworkplanet.blogspot.com/2008/11/volatile-field-and-memory-barrier-look.html

Вот почему вам все еще нужен замок.

Вопросы, которые могут / возможно, еще не ответили:

  1. Что на самом деле делает ваш синглтон-экземпляр? Может быть, нужно реорганизовать код экземпляра ...
  2. Какое количество потоков запущенного процесса? 8-позиционный блок не поможет вам, если у вас аномально большое количество потоков.
  3. Если оно больше, чем ожидалось, почему?
  4. Что еще работает в системе?
  5. Постоянно ли проблема с производительностью?
1
ответ дан 3 December 2019 в 10:44
поделиться

На самом деле нет необходимости использовать volatile для синглтона, поскольку вы устанавливаете его ровно один раз - и блокируете код, который устанавливает. См. статью Джона Скита о синглтонах для получения дополнительной информации.

0
ответ дан 3 December 2019 в 10:44
поделиться

Единственное, чего не будет делать volatile, - это вызвать переключение контекста. Если вы видите 500 000 переключений контекста в секунду, это означает, что ваши потоки что-то блокируют, а volatile не виноват.

3
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

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