Поделиться через


Потокобезопасность

Обновлен: Ноябрь 2007

Сам по себе класс Regex является потокобезопасным и неизменяемым (предназначенным только для чтения). Это означает, что объекты Regex могут создаваться в любом потоке и совместно использоваться несколькими потоками; одни и те же методы могут вызываться из любого потока, никак не изменяя при этом глобальное состояние.

Тем не менее, объекты с результатами (Match и MatchCollection), возвращаемые Regex, следует использовать только в одном потоке. Несмотря на то что по своей логике многие из этих объектов неизменяемы, их реализации способны задерживать вычисление некоторых результатов для повышения эффективности работы, поэтому в итоге вызывающим объектам приходится сериализовывать доступ к ним.

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

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

См. также

Другие ресурсы

Регулярные выражения в .NET Framework