|
Kata kunci kunci menandai blok pernyataan sebagai zona kritis dengan mengambil muteks untuk objek tertentu, mengeksekusi pernyataan, lalu melepaskan kunci.
Pernyataan kunci pada dasarnya menggunakan Monitor.Enter dan Monitor.Exit, yaitu, Monitor.Enter(this) dieksekusi saat lock(this) dieksekusi, dan Monitor.Exit(this) dieksekusi di akhir kurung kurawal keriting. Apa artinya, untuk objek apa pun, bagian pertama dari memori adalah alamat semua metode, dan bagian kedua adalah indeks. Dia menunjuk ke SyncBlock di area Cache SyncBlock di CLR. Apa artinya itu? Artinya, saat Anda menjalankan Monitor.Enter(Object), jika nilai indeks objek negatif, pilih SyncBlock dari Cache SyncBlock dan tempatkan alamatnya dalam indeks objek. Ini menyelesaikan kunci yang ditandai oleh objek, dan utas lain ingin melakukan operasi Monitor.Enter(object) lagi, yang akan mendapatkan indeks dengan objek positif, lalu menunggu. Sampai indeks menjadi negatif, yaitu utas menggunakan Monitor.Exit(object) untuk mengubah indeks menjadi negatif. Apa yang perlu Anda perhatikan saat menggunakan kunci:
1.lock tidak dapat mengunci nilai null Sebuah objek dapat menunjuk ke null, tetapi null tidak perlu dilepaskan. (Lihat juga: Memahami Nol Penuh) 2.Lock tidak dapat mengunci jenis string, meskipun juga merupakan jenis referensi. Karena jenis string "diarahkan" oleh CLR Ini berarti bahwa hanya ada satu instans string tertentu di seluruh program, dan objek yang sama mewakili teks tersebut di semua utas dari semua domain aplikasi yang sedang berjalan. Oleh karena itu, selama kunci ditempatkan pada string dengan konten yang sama di mana saja dalam proses aplikasi, semua instans string tersebut dalam aplikasi akan dikunci. Oleh karena itu, yang terbaik adalah mengunci anggota pribadi atau dilindungi yang tidak akan dipertahankan. 3.Locklock objek adalah batas memori blok program 4. Jenis nilai tidak dapat dikunci, karena "objek dilepaskan" berwarna merah di teks sebelumnya, dan jenis nilai bukan jenis referensi 5. Kunci menghindari mengunci jenis atau objek publik yang tidak dikendalikan oleh program. Misalnya, jika instans dapat diakses publik, lock(this) dapat menjadi masalah karena kode yang tidak terkontrol juga dapat mengunci objek. Hal ini dapat menyebabkan kebuntuan, di mana dua utas atau lebih menunggu untuk melepaskan objek yang sama. Mengunci tipe data publik (bukan objek) juga dapat menyebabkan masalah karena alasan yang sama. Saat menggunakan lock(this), nilai variabel anggota kelas dapat diubah oleh metode yang tidak berada di zona kritis
Skenario aplikasi: Ini sering digunakan untuk mencegah pengecualian yang tidak pasti dalam nilai variabel publik yang disebabkan oleh operasi multi-utas untuk memastikan keamanan operasi
|