Неизменность и статические переменные - PullRequest
1 голос
/ 05 мая 2009

Я проектирую некоторые неизменяемые классы, но мне нужно иметь некоторые переменные, такие как скажем .Count, чтобы иметь общее количество экземпляров. Но повлияет ли наличие статической переменной на многопоточность?

Поскольку такие методы, как Add, Remove и т. Д., Должны обновлять значение .Count. Может быть, я должен сделать это ленивым свойством?

Ответы [ 4 ]

2 голосов
/ 05 мая 2009

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

2 голосов
/ 05 мая 2009

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

1 голос
/ 05 мая 2009

Но может ли наличие статической переменной повлиять на многопоточность?

обязательно! На общее состояние влияет, по определению, многопоточность.

Поскольку такие методы, как Add, Remove и т. Д., Должны обновлять значение .Count. Может быть, я должен сделать это ленивым свойством?

лучше использовать класс, который делает атомарное добавление (как AtomicInteger в Java), чтобы избежать блокировок: посмотрите здесь

0 голосов
/ 05 мая 2009

Да, всякий раз, когда вы обновляете общую переменную в многопоточной среде, вам нужно будет просто обернуть эти обновления в блокировку.

...