Создание элемента static
повышает вероятность наличия многопоточного доступа, чем члена экземпляра.Помните, что static
не означает, что что-то безопасно для использования несколькими потоками, это означает, что объект совместно используется несколькими экземплярами объекта, в котором он определен.
Коллекции, которые реализуют интерфейс ICollection
можно привести к SyncRoot
, который можно использовать к lock
объекту, чтобы гарантировать, что только один поток за раз может выполнить серию инструкций, которые могут привести к изменению коллекции. Использование SyncRoot для многопоточных приложений
lock(((ICollection)myObject).SyncRoot)
{
//Code that should be executed by only one concurrent thread
//This is add/insert/remove/iterate/clear/etc.
}
В дополнение к этому руководству (или в старшей школе) в .NET 4 доступны параллельные объекты, которые делают это в основном, но с некоторыми другими специальнымичеки.По большей части эти объекты оптимизированы по производительности настолько, насколько это возможно для полностью безопасных объектов.Если вы используете очень контролируемый и небольшой набор действий над объектом (у вас есть 1 метод add, 1 метод удаления и вы никогда не перечисляете всю коллекцию, а просто получаете доступ к определенным, известным записям), вы можете использовать более легкий пример lock()
выше, чтобы повысить производительность.
Это особенно заметно при добавлении нескольких объектов в коллекцию одновременно.Используя параллельные объекты, каждая операция Add является атомарной с блокировкой и разблокировкой.Если вы выполняете это в тесном цикле, вы теряете немного производительности из-за получения блокировок снова и снова.Если другой поток пытается прочитать, конкуренция за доступ становится немного выше.Если вы сами используете оператор блокировки, вы можете просто получить блокировку, добавить объекты в быстрый и плотный цикл, а затем снять блокировку.Потоки, желающие получить доступ к объекту, будут ждать немного дольше, но в целом операции должны завершаться быстрее.Также имейте в виду, что различия, как правило, настолько малы, что на самом деле это не стоит, и почти во всех случаях подпадают под категорию преждевременной оптимизации.