Rumah >pembangunan bahagian belakang >C++ >Kenapa menggunakan `kunci (ini)` dalam multithreaded c# tidak digalakkan?

Kenapa menggunakan `kunci (ini)` dalam multithreaded c# tidak digalakkan?

Linda Hamilton
Linda Hamiltonasal
2025-01-31 06:11:09331semak imbas

Why is using `lock(this)` in multithreaded C# discouraged?

kenapa bermasalah dalam multithreaded C#lock(this)

Dokumentasi Microsoft menasihatkan untuk menggunakan

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)

  1. 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

  2. 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)

  3. 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.

  4. 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn