Start Debugging

Тег: concurrency

14 статей · Страница1из2

Lazy<T> vs LazyInitializer.EnsureInitialized vs блокировка с двойной проверкой в C#
По умолчанию используйте Lazy<T>: он выполняет фабрику один раз, кеширует исключения, а чтение после инициализации слишком дёшево, чтобы его можно было измерить. LazyInitializer.EnsureInitialized подходит, когда вы лениво заполняете много полей или ячеек массива и не можете позволить себе лишний объект на каждое значение. Ручная блокировка с двойной проверкой на .NET 10 почти никогда не оправдана.
Thread.Sleep, Task.Delay и SpinWait для ожидания в C#
Используйте await Task.Delay для любого ожидания по времени в асинхронном коде, Thread.Sleep только на выделенном потоке, которым вы владеете, а SpinWait только для ожиданий короче микросекунды внутри lock-free кода. Чтобы дождаться условия, применяйте сигнал (ManualResetEventSlim, SemaphoreSlim, TaskCompletionSource) вместо любого из этих трёх. Измерено на .NET 10.0.10.
Volatile.Read и Volatile.ReadBarrier в .NET 10
Volatile.Read выполняет чтение одной ячейки с семантикой acquire. Volatile.ReadBarrier, новый в .NET 10, это барьер, который придаёт семантику acquire всем предшествующим чтениям. Используйте Volatile.Read для флагов и опубликованных ссылок, а ReadBarrier, когда нужно, чтобы пачка обычных или неатомарных чтений завершилась до следующего обращения к памяти, как в seqlock.
Как атомарно добавить элемент в массив jsonb в PostgreSQL с EF Core и Npgsql
Загрузка сущности, вызов List.Add и сохранение перезаписывают весь документ jsonb и незаметно теряют параллельные добавления. Перенесите добавление в один UPDATE с оператором jsonb ||, через ExecuteSqlAsync или через сопоставленную функцию внутри ExecuteUpdateAsync, и сделайте его идемпотентным с помощью проверки @>.
Как гарантировать идемпотентную обработку сообщений в EF Core 11, когда одно и то же сообщение получают два экземпляра приложения
Проверка на существование в обработчике не та защита, за которую вы её принимаете. Поставьте уникальный индекс на таблицу inbox, пишите маркер в том же SaveChanges, что и бизнес-изменение, и пусть победителя выбирает база данных. Плюс ловушка с ExecuteUpdate, которая молча сводит всё это на нет.
Как использовать пессимистичную блокировку с UPDLOCK и SELECT ... FOR UPDATE в EF Core 11
В EF Core 11 по-прежнему нет API блокировок. Разбираем, как взять настоящую блокировку строки через FromSql: WITH (UPDLOCK, ROWLOCK) в SQL Server, FOR UPDATE в PostgreSQL, ловушка с подзапросом, которая молча расширяет блокировку, NOWAIT и SKIP LOCKED, повторы при дедлоках и что делать, когда строки ещё нет.
2026-08-29 dartflutterisolates
В чем разница между isolate в Dart и потоком?
Поток разделяет память со всеми остальными потоками процесса. Isolate в Dart не разделяет: у него собственная куча, один цикл событий, а с другими isolate он общается только сообщениями. Разбираем, что это значит на уровне VM, где isolate groups размывают границу и как все это проявляется во Flutter, FFI и вебе.
Как реализовать оптимистичную конкурентность с токеном rowversion в EF Core 11
Добавляем токен конкурентности rowversion в EF Core 11: настройка через [Timestamp] и IsRowVersion, SQL, который EF действительно генерирует, перехват DbUpdateConcurrencyException, побеждает база vs побеждает клиент vs слияние, отсоединённые API с ETag и пять ловушек, которые молча отключают всю защиту.
lock vs Monitor vs SemaphoreSlim vs System.Threading.Lock в C#
Четыре способа защитить критическую секцию в C# и матрица решений для выбора одного из них. Используйте System.Threading.Lock для синхронной взаимной блокировки на .NET 9+, SemaphoreSlim когда секция охватывает await, и Monitor только когда нужны Wait/Pulse.
Вперёд