Konsep kunci baca-tulis sederhana, memungkinkan beberapa utas untuk memperoleh kunci baca secara bersamaan, tetapi hanya satu utas yang diizinkan untuk mendapatkan kunci tulis secara bersamaan, sehingga disebut juga kunci eksklusif bersama. Di C#, disarankan untuk menggunakan kelas ReaderWriterLockSlim untuk menyelesaikan fungsi kunci baca/tulis. Dalam beberapa kasus, jumlah pembacaan ke suatu objek jauh lebih besar daripada jumlah modifikasi, dan jika hanya dikunci dengan mengunci, itu akan mempengaruhi efisiensi pembacaan. Jika kunci baca-tulis digunakan, beberapa utas dapat membaca objek secara bersamaan, dan hanya akan diblokir ketika objek ditempati oleh kunci tulis. Sederhananya, ketika utas memasuki mode baca, utas lain masih dapat masuk ke mode baca, dengan asumsi bahwa utas ingin masuk ke mode tulis saat ini, maka utas harus diblokir. Hingga mode baca keluar. Demikian pula, jika utas masuk ke mode tulis, utas lain akan diblokir apakah mereka ingin menulis atau membaca. Ada 2 cara untuk masuk ke mode tulis/baca: EnterReadLock mencoba memasuki status kunci mode tulis. TryEnterReadLock(Int32) mencoba memasuki status kunci mode baca, dengan opsi untuk memilih batas waktu bilangan bulat. EnterWriteLock mencoba memasuki status Kunci Mode Tulis. TryEnterWriteLock(Int32) mencoba memasuki status kunci mode tulis, dan waktu habis dapat dipilih. Ada 2 cara untuk keluar dari mode tulis/baca: ExitReadLock mengurangi jumlah rekursif mode baca dan keluar dari mode baca ketika jumlah yang dihasilkan adalah 0 (nol). ExitWriteLock mengurangi jumlah rekursif pola tulis dan keluar dari mode tulis ketika jumlah yang dihasilkan adalah 0 (nol). Berikut cara menggunakannya:
Anda dapat melihat bahwa utas 3 dan utas 4 dapat masuk ke mode baca secara bersamaan, sedangkan utas 5 dapat masuk ke mode tulis setelah 5 detik (yaitu, setelah utas 3 dan 4 keluar dari kunci baca). Ubah kode di atas, pertama-tama buka 2 utas dalam mode tulis, lalu buka utas dalam mode baca, kodenya adalah sebagai berikut:
Hasilnya adalah sebagai berikut:
Seperti yang Anda lihat, utas 3 dan utas 4 keduanya masuk ke mode tulis, tetapi utas 3 menempati kunci tulis terlebih dahulu, jadi utas 4 harus menunggu 10 detik sebelum masuk. Utas 5 dan 6 harus menempati kunci baca, jadi tunggu hingga utas 4 keluar dari kunci tulis sebelum melanjutkan. TryEnterReadLock dan TryEnterWriteLock dapat mengatur batas waktu, saat menjalankan kalimat ini, utas akan diblokir di sini, jika kunci dapat ditempati saat ini, maka mengembalikan true, jika waktu batas waktu belum menempati kunci, maka kembalikan false, lepaskan pendudukan kunci, dan lanjutkan untuk mengeksekusi kode berikut secara langsung. EnterUpgradeableReadLock Kelas ReaderWriterLockSlim menyediakan mode baca yang dapat ditingkatkan, yang berbeda dari mode baca karena juga dapat ditingkatkan ke mode tulis dengan memanggil metode EnterWriteLock atau TryEnterWriteLock. Karena hanya satu utas yang dapat dalam mode yang dapat ditingkatkan pada satu waktu. Utas yang memasuki mode yang dapat ditingkatkan tidak akan memengaruhi utas dalam mode baca, yaitu, ketika utas memasuki mode yang dapat ditingkatkan, sejumlah utas dapat masuk ke mode baca secara bersamaan tanpa memblokir. Jika beberapa utas sudah menunggu untuk memperoleh kunci tulis, menjalankan EnterUpgradeableReadLock akan memblokir hingga utas tersebut habis waktu atau keluar dari kunci tulis. Kode berikut menunjukkan cara meningkatkan ke kunci tulis dalam mode baca yang dapat ditingkatkan.
Dampak kunci baca/tulis pada kinerja sudah jelas. Kode pengujian berikut:
Kode di atas mensimulasikan pengoperasian 500 Tugas, yang masing-masing menempati utas kumpulan utas, di mana 20 di antaranya adalah utas tulis dan 480 utas baca disimulasikan. Dibutuhkan 10 ms untuk membaca data dan 100 ms untuk menulis untuk menguji metode kunci dan metode ReaderWriterLockSlim masing-masing. Perkiraan dapat dibuat, untuk ReaderWriterLockSlim, dengan asumsi bahwa 480 utas membaca pada saat yang sama, maka menghabiskan 10 milidetik, 20 operasi tulis menempati 2000 milids, jadi waktu yang dikonsumsi adalah 2010 milids, dan untuk metode kunci biasa, karena semuanya eksklusif, jadi 480 operasi baca menempati 4800 ms + 20 operasi tulis 2000 ms = 6800 milids. Hasilnya menunjukkan peningkatan kinerja yang nyata.
|