Что такое interlocked

Ответ

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, если можно просто сказать "пошёл нахуй" другим потокам на уровне процессора.