Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

В каком случае лучше использовать volatile?

Предположим, у меня имеется List, который одновременно читает один поток, а другой в него пишет. В данному случае что было бы правильнее и быстрее использовать: volatile или ConcurrentBag?


Ответ

О скорости можно говорить лишь тогда, когда у вас имплементирована функциональность, и профилирование показывает, что доступ к данным является bottleneck'ом. Поэтому давайте разберёмся с корректностью.
Начнём с того, что volatile мы не можем применить к списку — volatile-поля могут быть только элементарных типов. Даже если бы его можно было применить, что толку в синхронизации доступа к ссылке на контейнер? Гонки-то у нас по данным внутри контейнера.
ConcurrentBag — это более разумный выбор. Но это только если реально данные лишь добавляются в одном из потоков, а не модифицируются им. В зависимости от вашей точной задачи, может понадобиться ConcurrentBag (если не важен порядок) или ConcurrentQueue (если важен).
Если нужен доступ по индексу, или модификация данных в пишущем потоке (например: collection[i]++), не стоит искать выгоду в несколько микросекунд, проще и безопаснее использовать нормальный lock

Комментариев нет:

Отправить комментарий