lock deyimi
lock ile kritik bölge korumasını öğrenirsin.
lock deyimi
lock deyimi, bir kritik bölgeyi (critical section) korur. lock (_sync) { /* sadece bir thread */ } bloğuna aynı anda yalnızca bir thread girebilir; diğerleri bekler.
lock aslında Monitor.Enter ve Monitor.Exit'in kısayoludur. Kilit nesnesi olarak genellikle private readonly object _sync = new(); kullanılır; this veya string kilitlemek tehlikelidir.
lock ve atomiklik
lock, bloğun içindeki kodu atomik yapar; birden fazla thread aynı veriyi aynı anda değiştiremez. Bu, sayaç artırma (counter++), liste ekleme gibi işlemlerde veri yarışını (race condition) önler.
lock maliyetlidir; çok küçük işlerde Interlocked gibi daha hafif alternatifler tercih edilebilir. Doğru tercih, performans ve güvenlik dengesini gözetir.
Uygulama lock ile sayaç artır
private static readonly object _sync = new object(); ve private static int _counter = 0; tanımla. Main'de 2 thread oluştur, her biri lock (_sync) { _counter++; } çağırsın. Thread'leri Join ile bekle. En son Console.WriteLine($"Sayaç: {_counter}"); yaz. (2 thread * 1 artırma = 2 beklenir.)
Örnek çözümü göster
{_counter}");
Örnek çözüm:
using System;
using System.Threading;
class Program
{
private static readonly object _sync = new object();
private static int _counter = 0;
static void Main()
{
Thread t1 = new Thread(() => { lock (_sync) { _counter++; } });
Thread t2 = new Thread(() => { lock (_sync) { _counter++; } });
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine($"Sayaç: {_counter}");
}
}
Kendini test et
-
lock kavramlarını eşleştir
- lock (_sync)
- Kritik bölge
- Monitor.Enter
- lock'un temeli
- private readonly object _sync
- Kilit nesnesi
- this (kilitleme)
- Tehlikeli
-
lock hangi nesneyle kullanılmalıdır?
- private readonly object
- this
- string literal
- typeof(int)
Cevabı göster
private readonly object — Doğru. Özel readonly object en güvenli kilit nesnesidir.
-
lock deyimini tamamla
____ (_sync) { counter++; }Cevabı göster
lock (_sync) { counter++; }