Saya meninjau beberapa kode yang ditulis oleh seorang konsultan, dan sementara lusinan tanda bahaya telah muncul, saya tidak dapat memahami cuplikan berikut:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Apa yang dilakukan kunci (objek baru ()) di sini? Seharusnya tidak berpengaruh apa pun karena selalu mengunci objek lain, tetapi jenis penguncian ini tetap ada di seluruh kode, bahkan di bagian yang tidak disalin dan ditempel. Apakah ini kasus khusus dalam bahasa C # yang dikompilasi menjadi sesuatu yang tidak saya ketahui, atau apakah pemrogram hanya mengadopsi beberapa kultus kargo yang kebetulan berfungsi beberapa waktu lalu?
c#
thread-safety
locking
Charles
sumber
sumber
new object()
disimpan di bidang, dan bidang itu digunakan dalamlock()
pernyataan, dan mereka tidak tahu lebih baik untuk tidak menyebarnya.lock
kode itu sama sekali tidak bergunaJawaban:
Saya tidak akan terkejut jika seseorang yang melihat ini:
private readonly object lockObj = new object(); private void MyMethod() { lock(lockObj) { // do amazing stuff, so amazing it can only run once at a time // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ?? } }
dan mengira dia bisa memotong jumlah baris.
Saya akan sangat khawatir jika itu masalahnya ...
sumber
Inilah pertanyaan serupa, dan jawabannya:
sumber
Mungkin tidak berguna. Tapi ada kemungkinan itu ada untuk menciptakan penghalang memori. Tidak yakin apakah c # tidak mengunci elisi atau apakah itu mempertahankan semantik urutan kunci.
sumber