Ответ
Interlocked — это класс в .NET, предоставляющий атомарные операции для работы с переменными в многопоточной среде. Он гарантирует, что операции (инкремент, декремент, обмен, сравнение) выполняются как единое целое без вмешательства других потоков.
Пример:
int counter = 0;
Interlocked.Increment(ref counter); // Атомарное увеличение на 1
Interlocked.Exchange(ref counter, 10); // Атомарная установка значения
Особенности:
- Не требует блокировки (
lock), но подходит только для простых операций. - Работает с
int,long,objectи др. - Гарантирует порядок выполнения операций между потоками (memory barrier).
Когда использовать:
- Для простых операций (счётчики, флаги).
- Когда
lockизбыточен и нужна максимальная производительность.
Ограничения:
- Не подходит для сложных многошаговых операций — тут нужен
lockили другие同步примитивы.
Ответ 18+ 🔞
А, ну это же про Interlocked, да? Класс такой в .NET, который как будто кричит другим потокам: "Пошёл на хуй, я сейчас тут работаю, подожди секунду!" А потом — хуяк — и операция сделана.
Вот представь: у тебя есть переменная, обычный int counter = 0. И куча потоков лезет её менять одновременно. Если делать через counter++, то это же пиздец начнётся: один поток прочитал, второй в это время уже перезаписал, первый своё старое значение обратно пишет — и всё, каша, потерянные обновления, счётчик ебётся.
А Interlocked.Increment — это как атомарный удар кувалдой. Всё происходит за один неделимый такт процессора. Никто не может влезть посередине. Прочитал, увеличил, записал — и ни одна сука не успела моргнуть.
int counter = 0;
Interlocked.Increment(ref counter); // Бдыщ! Уже 1. Атомарно, блядь.
Interlocked.Exchange(ref counter, 10); // А теперь раз — и сразу 10. Без шансов для других.
В чём прикол-то? В том, что не надо городить эти lock (obj) { counter++; }. Lock — это тяжёлая артиллерия, там мотоцикл заводить, чтобы спичку зажечь. А Interlocked — это как щелчок зажигалкой: быстро, чётко, и если операция простая (прибавить, вычесть, поменять значение), то вообще красота.
Работает он не только с int, но и с long, и с ссылками (object), и даже сравнение с обменом делает (CompareExchange) — это вообще магия, чтобы без блокировок что-то умное делать.
Так когда его юзать? Да когда у тебя простейшая хуйня: счётчик запросов, флаг "запущено/остановлено", или нужно безопасно подменить одну ссылку на другую. Когда хочется скорости и минимальных накладных расходов.
А когда он не годится? Да когда тебе нужно не просто "прибавить единичку", а сделать что-то многошаговое. Например, прочитать значение, проверить его, что-то посчитать на его основе и только потом записать. Вот тут Interlocked один не справится — между чтением и записью другой поток уже всё изменит. Тут уже нужен полноценный lock или другие примитивы синхронизации, по-взрослому.
Короче, Interlocked — это твой быстрый и злой инструмент для простых атомарных действий. Не таскай за собой тяжёлый lock, если можно просто сказать "пошёл нахуй" другим потокам на уровне процессора.