Rumah >pembangunan bahagian belakang >C++ >Kenapa menggunakan `kunci (ini)` dalam multithreaded c# tidak digalakkan?
kenapa bermasalah dalam multithreaded C#lock(this)
untuk melindungi akses objek jika objek itu boleh diakses secara terbuka. Mari kita meneroka sebab -sebab di sebalik cadangan ini. lock(this)
risiko utama menggunakan : lock(this)
penguncian yang tidak terkawal: Objek yang boleh diakses secara umum bermaksud mana -mana kod boleh memperoleh kunci pada . Ini membuka pintu kepada masalah penyegerakan yang tidak dapat diramalkan, menjadikan kod multithreaded jauh lebih sukar untuk mereka bentuk dan debug dengan betul. this
Pelanggaran enkapsulasi: Menggunakan medan peribadi dan objek kunci khusus biasanya disukai. Pendekatan ini menguatkuasakan kawalan akses dan mengekalkan mekanisme penguncian dalaman, memelihara enkapsulasi. mendedahkan pelaksanaan penguncian, menjejaskan prinsip reka bentuk penting ini. lock(this)
salah faham tingkah laku : lock
salah tanggapan umum ialah entah bagaimana membuat objek baca sahaja. Ini tidak betul. Objek hanya bertindak sebagai kunci lock(this)
kekunci . Sekiranya benang lain memegang kunci, percubaan berikutnya akan menyekat, tetapi objek itu sendiri tetap boleh diubah suai.
Mengunci pada jenis yang tidak berubah: Jangan sekali -kali mengunci jenis yang tidak berubah seperti rentetan. Ini sering dikongsi di seluruh permohonan, yang membawa kepada kebuntuan atau tingkah laku yang tidak dijangka. Gunakan objek peribadi, mutable (seperti contoh yang berdedikasi) untuk mengunci sebaliknya. object
Contoh ilustrasi:
Pertimbangkan kod C# ini:
<code class="language-csharp">public class Person { public int Age { get; set; } public string Name { get; set; } public void LockThis() { lock (this) { System.Threading.Thread.Sleep(10000); // Simulate a long operation } } }</code>Contoh ini menyoroti masalah. Walaupun
memegang kunci pada LockThis()
, benang lain masih boleh mengubah this
serentak, menunjukkan bahawa Name
tidak semestinya menghalang pengubahsuaian. Kekurangan perlindungan terjamin ini adalah sebab utama amaran. lock(this)
Atas ialah kandungan terperinci Kenapa menggunakan `kunci (ini)` dalam multithreaded c# tidak digalakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!