Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 193519|Jawab: 11

[Sumber] .net/c# Pengguna multithreaded concurrency lock(string){...} Penjelasan rinci

[Salin tautan]
Diposting pada 03/07/2019 15.25.19 | | | |
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)




Mantan:Penulisan tipe LPSTR MFC
Depan:OpenSSL jelas telah diperbarui, Apache masih meminta versi lama?
Diposting pada 13/05/2022 14.27.17 |
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.
 Tuan tanah| Diposting pada 12/08/2023 19.48.15 |
Monitor Prinsip Kunci .NET/C# memberikan penjelasan mendalam
https://www.itsvse.com/thread-9633-1-1.html
Diposting pada 07/01/2023 11.22.02 |
Saya juga menemukannya dalam praktik kerja saya, terima kasih kepada penulis untuk artikel teknis ini
Diposting pada 03/07/2019 20.02.32 |
Ini hal yang bagus
Diposting pada 18/06/2021 14.24.43 |
Apa yang ditampilkan di halaman adalah kode tidak dapat dilihat
Diposting pada 29/06/2021 00.21.16 |
Lihat kodenya
Diposting pada 29/06/2021 00.54.24 |
Saya tidak dapat melihat kodenya
Diposting pada 14/05/2022 10.06.46 |
Belajar belajar
Diposting pada 28/05/2022 22.03.59 |
Sangat bagus, dipelajari
Diposting pada 28/11/2022 21.46.47 |
Bisakah asp.net digunakan?
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com