Istoric, sincronizarea secțiunilor critice în C# folosea instrucțiunea lock aplicată pe o instanță oarecare de obiect:
private readonly object _syncRoot = new object();
lock (_syncRoot) { /* secțiune critică */ }
Deși convenabil, acest mecanism depindea de o structură internă complexă a runtime-ului CLR numită SyncBlock, alocată dinamic în antetul fiecărui obiect la primul lock. Acest lucru introducea overhead de memorie, penalizări de performanță și riscul ca un dezvoltator să blocheze accidental o structură sau un șir partajat din greșeală.
În C# 13 și .NET 9, Microsoft introduce tipul specializat System.Threading.Lock, iar compilatorul recunoaște acest tip și optimizează automat instrucțiunea lock.
using System.Threading;
public class ContorThreadSafe
{
// Folosim noul tip dedicat de blocare din .NET 9:
private readonly Lock _lacat = new Lock();
private int _valoare = 0;
public void Incrementeaza()
{
// Compilatorul C# 13 transformă automat acest apel în apelul optimizat _lacat.EnterScope():
lock (_lacat)
{
_valoare++;
}
}
public int Citeste()
{
lock (_lacat)
{
return _valoare;
}
}
}
Avantaje Tehnice Măsurabile
- Performanță Superioară:
System.Threading.Lockeste optimizat la nivel de procesor și este cu 15-25% mai rapid în scenarii de blocare concurentă intensă decât vechiul monitor CLR. - API Modern Scope-based: Permite utilizarea directă cu
using (_lacat.EnterScope()) { ... }, structura returnată fiind unref structcu zero alocări de memorie pe Heap.