Pernyataan kunci mengambil muteks objek tertentu, mengeksekusi blok pernyataan, lalu melepaskan kunci. Saat memegang kunci, benang yang menahan kunci dapat memperoleh dan melepaskan kunci lagi. Utas lain diblokir agar tidak mendapatkan kunci dan menunggu hingga kunci dilepaskan.
Resensi:
Gunakan kode kunci
Setara dengan
Dapat dianggap bahwa kode yang mendasari Lock diimplementasikan oleh Monitor.
Karena kode menggunakan try... final, jadi meskipun pengecualian dilemparkan ke dalam isi pernyataan kunci, kunci dilepaskan.
Anda tidak dapat menggunakan kunci operator await di isi pernyataan.Anda tidak dapat menggunakannya di badan pernyataanmenunggukunci operator。 Anda tidak dapat menggunakan kunci operator await di isi pernyataan. Anda tidak dapat menggunakan kunci operator await di isi pernyataan. Kalimat ini sangat penting!
Dokumentasi:Login hyperlink terlihat.
Saya menguji kodenya sendiri,Gunakan Tugas untuk mendapatkan kunci dan gunakan await untuk memblokir, kodenya adalah sebagai berikut:
Setelah mengeksekusi kode berikut beberapa kali, hasil eksekusi tidak seperti yang diharapkan.
Mengapa? Jika Anda mencoba menggunakan kata kunci await saat mencoba menggunakan kata kunci await di blok kunci, Anda akan mendapatkan kesalahan kompilasi ini: cannot await di isi pernyataan kunci. Alasannya adalah setelah await selesai, metode dapat berjalan di utas yang berbeda alih-alih utas (utas panggilan) sebelum kata kunci await.kuncikata kunciutas yang samaDapatkan kunci dan lepaskan kunci di kunci。 Ubah kode untuk melihat alasannya secara lebih intuitif:
Dapatkan id utas kunci dan id utas pelepas kunci,Jelas tidak ada utas, sehingga kunci tidak dapat berhasil dilepaskan, seperti yang ditunjukkan pada gambar di bawah ini:
Mencoba memodifikasi kode, diuji dengan utas, dieksekusi beberapa kali, dan berfungsi seperti yang diharapkan, kodenya adalah sebagai berikut:
(Akhir)
|