Skenario penyalahgunaan umum: Untuk mencegah pembayaran duplikat pesanan yang disebabkan oleh pengguna secara tidak sengaja mengklik tombol pembayaran beberapa kali, kami menggunakan kunci (nomor pesanan) untuk memastikan bahwa hanya satu utas yang diizinkan untuk melakukan operasi pada pesanan.
Ide ini bagus, setidaknya lebih baik daripada lock (objek statis pribadi untuk kelas pemrosesan), karena efek dari penguncian nomor pesanan adalah hanya mengunci operasi 1 order saat ini, dan jika kunci variabel statis, yaitu mengunci semua pesanan, akan menyebabkan semua pesanan diantri, yang jelas tidak masuk akal.
Jadi dapatkah metode kunci (nomor pesanan) yang disebutkan di awal artikel ini mencapai efek yang diinginkan? Mari kita gunakan beberapa kode untuk memulihkan skenario penggunaan terlebih dahulu.
Jika Anda mengabaikan informasi pengguna dan validasi lainnya, kodenya terlihat seperti ini:
Untuk kata kunci kunci, MSDN menyertakan informasi yang dapat ditemukan di Baidu, dan tampaknya disarankan untuk tidak menggunakan lock(string), dan alasannya sama. Bagian berikut diambil dari saran MSDN tentang string kunci:
Masalah lock("myLock") terjadi karena kode lain yang menggunakan string yang sama dalam proses akan berbagi kunci yang sama. Kalimat ini menyembunyikan mekanisme besar, yaitu "string yang sama".
Apa itu "string yang sama"? Lihat kodenya:
Apakah str1 dan str2 adalah string yang sama di atas? Jawabannya adalah YA.
Lihat lagi:
Apakah str1 dan str2 di atas masih string yang sama? Jawabannya adalah TIDAK.
Oke, mari kita kembali ke masalah pembayaran pesanan kita. Dalam kode kami, lock(orderNumber), ketika pengguna secara tidak sengaja mengklik beberapa kali lagi setelah menggesek tangannya, apakah orderNumber yang memasukkan tindakan ini memiliki string yang sama setiap kali? Jawabannya adalah TIDAK. Ini untuk mengatakan
Kode yang menangani urutan di atas sebenarnya tidak bertindak sebagai kunci.
Faktanya, ada dua jenis perbandingan string, lihat kodenya:
Baris pertama dari kode di atas menghasilkan True, dan baris kedua menghasilkan False. Saya yakin Anda mengerti apa yang dimaksud MSDN dengan "string yang sama" tanpa penjelasan saya.
Solusi terbaik
Solusi untuk tali penguncian yang optimal:
Kode demo:
Di situs web, terkadang variabel global dapat digunakan, variabel global ini, ketika beberapa pengguna mengakses secara bersamaan, mungkin tampak tidak normal, saat ini, kami akan mengatur kunci global, tetapi kerugiannya adalah semua akses akan menunggu secara bergantian.
Dalam beberapa skenario, misalnya, pengguna yang sama hanya dapat berkomentar sekali dalam waktu 15 detik, jika kunci global digunakan, fungsi komentar akan sangat lambat untuk diproses ketika jumlah pengguna melonjak, yang akan sangat memengaruhi pengalaman pengguna.
Pada saat ini,Kita dapat mengatur kunci untuk setiap pengguna satu per satu, lock(string){...}, dan nama kunci dapat didefinisikan sebagai:Nama metode + ID penggunaDengan cara ini, setiap pengguna memiliki kunci independen, dan saat menilai interval komentar, itu tidak akan memengaruhi komentar pengguna lain.
(Akhir)
|