Да, , если они независимы друг от друга, это действительно будет более эффективным, так как доступ к одному не блокирует доступ к другому.Вы также получаете деньги за риск тупика, если эта независимость окажется ложной.
Вопрос в том, предполагая, что _someProperty1 = new List<SomeObject1>();
не является реальным кодом для присвоения _someProperty1
(вряд ли стоит ленивая нагрузка, правда?), тогда возникает вопрос: может ли код, который заполняет SomeProperty1, когда-либо вызывать то, что заполняет SomeProperty2, или наоборот, через любой путь кода, независимо от того, насколько причудливым?1008 * Даже если один может позвонить другому, не может быть тупика, но если они оба могут звонить друг другу (или 1 вызов 2, 2 вызова 3 и 3 вызова 1 и т. Д.), То тупик может определеннослучается.
Как правило, я бы начал с широких блокировок (одна блокировка для всех заблокированных задач), а затем сузил бы блокировки по мере необходимости при оптимизации.В тех случаях, когда у вас есть, скажем, 20 методов, которые требуют блокировки, тогда оценка безопасности может оказаться сложнее (также вы начинаете заполнять память только объектами блокировки).
Обратите внимание, что с вашим кодом есть две проблемытакже:
Во-первых, вы не блокируете свой сеттер.Возможно, это нормально (вы просто хотите, чтобы ваша блокировка предотвращала множественные тяжелые вызовы в метод загрузки, и на самом деле не волнует, есть ли перезаписи между set
и get
), возможно, это катастрофа.
Во-вторых, в зависимости от того, на каком процессоре он запущен, при проверке дважды проверяйте, могут ли возникать проблемы с переупорядочением чтения / записи, поэтому у вас должно быть поле volatile или вызов барьера памяти.См. http://blogs.msdn.com/b/brada/archive/2004/05/12/130935.aspx
Редактировать:
Также стоит подумать, действительно ли это вообще нужно.
Учтите, что сама операция должна быть поточно-ориентированной:
- Сделать кучу вещей сделано.
- Создать объект, основанный на этой куче вещей.
- Назначить этот объект локальной переменной.
1 и 2 будут происходить только в одном потоке, а 3 атомарно.Таким образом, преимущество блокировки:
Если выполнение вышеуказанных шагов 1 и / или 2 имеет свои проблемы с многопоточностью и не защищено от них своими собственными блокировками, блокировка100% необходимо.
Если что-то будет иметь катастрофические последствия для значения, полученного на шагах 1 и 2, а затем - для повторения шагов 1 и 2,блокировка необходима на 100%.
Блокировка предотвратит многократное использование отходов 1 и 2.
Итак, если мы можем правитьВ случае проблем 1 и 2 (требуется небольшой анализ, но это часто возможно), тогда мы можем предотвратить бесполезные потери в случае 3.Теперь, может быть, это большое беспокойство.Однако, если он возникнет редко, а также не будет такой большой тратой, когда он это сделал, выигрыш от отсутствия блокировки перевесит выигрыш от блокировки.
Если сомневаетесь, блокировка, вероятно, безопаснееподход, но возможно, что лучше просто жить с потраченной впустую операцией.