Rumah >pembangunan bahagian belakang >C++ >Kenapa `Lock (ini)` Berbahaya dalam pengaturcaraan multithreaded?
Elakkan penggunaan
: bahaya tersembunyi dalam pengaturcaraan multi -threaded lock(this)
Dokumen Microsoft jelas disyorkan untuk mengelakkan penggunaan
lock(this)
Masalah penguncian yang tidak terkawal
Inti masalah adalah mustahil untuk mengawal benang lain yang dapat mengunci objek yang sama. Ini boleh membawa kepada kunci mati.
Anggapkan bahawa objek didedahkan secara terbuka, sesiapa sahaja boleh mendapatkan rujukannya. Jika mana -mana rujukan ini digunakan untuk mengunci objek, pencipta objek mungkin tidak mengetahui apa -apa mengenainya, yang akan merumitkan pelaksanaan selari dan boleh menyebabkan kesilapan kemalangan.memusnahkan enkapsulasi dan mengurangkan kejelasan
Menggunakan prinsip pembungkusan haram , mekanisme penguncian terdedah kepada akses awam. Ini menjadikan sukar untuk memahami penggunaan dan tingkah laku yang diharapkan. Sebaliknya, mengunci dengan bidang persendirian dapat memberikan pemisahan titik perhatian yang lebih jelas dan memastikan penguncian secara dalaman tanpa terdedah kepada butiran pelaksanaan yang tidak perlu. bahaya salah faham dan rentetan
lock(this)
Beberapa salah faham secara tidak sengaja menyumbang kepada penggunaan
hanya untuk mengenal pasti kunci untuk mengenal pasti objek kunci. Perangkap lain adalah untuk cuba menggunakan rentetan sebagai kunci dalam pernyataan
. Kerana rentetan tidak berubah dan dikongsi antara aplikasi, pendekatan ini boleh menyebabkan konflik kunci yang tidak dijangka. Sebaliknya, lebih baik menggunakan objek peribadi sebagai kunci untuk mengawal mekanisme kunci dengan lebih baik.
lock(this)
Kajian kes: Keselamatan benang dalam rawatan selari lock
Untuk menjelaskan masalah yang berpotensi, sila pertimbangkan kod C#berikut: lock
Dalam kaedah utama, buat pelbagai benang, dan setiap benang cuba melakukan operasi pada objek . kaedah untuk cuba menggunakan kunci objek
mendapatkan objek. Walau bagaimanapun, kaedah dan juga cuba mengunci objek secara langsung atau tidak langsung, dan menggunakansebagai kunci. Ini akan membawa kepada konflik kunci yang tidak dijangka dan kunci mati, kerana kod itu cuba melakukan operasi di atasnya apabila mengunci objek benang lain. (Diandaikan bahawa kaedah TimeWarp dan Namechaange juga menggunakan kunci dan menggunakan ini atau orang. Nama sebagai objek kunci. Teks asal tidak memberikan kod lengkap)
Singkatnya, gunakan<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); } } }</code>untuk memusnahkan keselamatan benang dan mewujudkan kebuntuan yang berpotensi. Menggunakan mekanisme penguncian pembungkusan medan peribadi, dan menggunakan objek peribadi sebagai kunci dalam pernyataan
, ia dapat memberikan kaedah penyegerakan thread yang lebih mantap dan boleh dipercayai. Person
Atas ialah kandungan terperinci Kenapa `Lock (ini)` Berbahaya dalam pengaturcaraan multithreaded?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!