В SpringMVC вы можете указать значения из строки запроса, которые будут проанализированы и переданы как параметры метода с аннотацией @RequestParam.
public ModelAndView getPage(
@RequestParam(value="page", required=false) String page,
@RequestParam(value="gotoUrl", required = false) String gotoUrl) {
}
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.
В приведенном здесь примере 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
}
}
К сожалению, синглтон плохо относится почти ко всему :)
Это не моя область знаний, но, насколько мне известно, в volatile нет ничего особенного, кроме компилятора / времени выполнения, НЕ переупорядочивающего чтение / запись (в переменную) в целях оптимизации.
Изменить: Я исправился. Энергозависимость не только создает барьеры для памяти, но и то, что происходит (и, кстати, производительность), во многом зависит от конкретного процессора. См. http://dotnetframeworkplanet.blogspot.com/2008/11/volatile-field-and-memory-barrier-look.html
Вот почему вам все еще нужен замок.
Вопросы, которые могут / возможно, еще не ответили:
На самом деле нет необходимости использовать volatile для синглтона, поскольку вы устанавливаете его ровно один раз - и блокируете код, который устанавливает. См. статью Джона Скита о синглтонах для получения дополнительной информации.
Единственное, чего не будет делать volatile, - это вызвать переключение контекста. Если вы видите 500 000 переключений контекста в секунду, это означает, что ваши потоки что-то блокируют, а volatile не виноват.