Tidak, tidak selama Anda mengunci objek yang sama. Kode rekursif secara efektif sudah memiliki kunci sehingga dapat terus berlanjut tanpa hambatan.
lock(object) {...}
adalah singkatan dari penggunaan kelas Monitor . Seperti yang ditunjukkan Marc , Monitor
memungkinkan masuk kembali , jadi upaya berulang untuk mengunci objek di mana utas saat ini sudah memiliki kunci akan berfungsi dengan baik.
Jika Anda mulai mengunci objek yang berbeda , saat itulah Anda harus berhati-hati. Beri perhatian khusus pada:
- Selalu dapatkan kunci pada sejumlah objek dalam urutan yang sama.
- Selalu buka kunci dalam urutan yang berlawanan dengan cara Anda mendapatkannya.
Jika Anda melanggar salah satu aturan ini, Anda dijamin akan mendapatkan masalah kebuntuan di beberapa titik .
Berikut adalah satu halaman web bagus yang menjelaskan sinkronisasi utas di .NET: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
Selain itu, kunci objek sesedikit mungkin. Pertimbangkan untuk menerapkan kunci berbutir kasar jika memungkinkan. Idenya adalah bahwa jika Anda dapat menulis kode Anda sedemikian rupa sehingga ada grafik objek dan Anda dapat memperoleh kunci pada akar grafik objek tersebut, maka lakukanlah. Ini berarti Anda memiliki satu kunci pada objek root tersebut dan oleh karena itu tidak perlu terlalu mengkhawatirkan urutan di mana Anda memperoleh / melepaskan kunci.
(Satu catatan lagi, contoh Anda secara teknis tidak rekursif. Agar menjadi rekursif, Bar()
harus memanggil dirinya sendiri, biasanya sebagai bagian dari iterasi.)