В вашем примере, volatile не должно быть предметом какого-либо "замедления".
Однако блокировка () может включать в себя огромные обходы ядра, особенно если за блокировку много споров.
В этом случае нет необходимости блокировать ваш синглтон, вы можете просто
делать
class Foo {
static Foo instance = new Foo();
public static Foo FooInstance() {
return instance ;
}
}
Конечно, если 'instance' используется во многих различных потоках, вам все равно придется блокировать () все, что изменяет этот 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
}
}