Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 193519|Απάντηση: 11

[Πηγή] .net/c# Κλείδωμα συγχρονισμού πολλαπλών νημάτων χρήστη(string){...} Λεπτομερής εξήγηση

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 3/7/2019 3:25:19 μ.μ. | | | |
Συνήθη σενάρια κατάχρησης: Προκειμένου να αποτραπεί η διπλή πληρωμή παραγγελιών που προκαλείται από χρήστες που κάνουν κατά λάθος κλικ στο κουμπί πληρωμής πολλές φορές, χρησιμοποιούμε κλείδωμα (αριθμός παραγγελίας) για να διασφαλίσουμε ότι μόνο ένα νήμα επιτρέπεται να εκτελέσει τη λειτουργία στην παραγγελία.

Αυτή η ιδέα είναι καλή, τουλάχιστον καλύτερη από το κλείδωμα (ένα ιδιωτικό στατικό αντικείμενο για την επεξεργασία κλάσεων), επειδή το αποτέλεσμα του κλειδώματος του αριθμού παραγγελίας είναι να κλειδώνει μόνο τη λειτουργία της τρέχουσας εντολής 1 και εάν το κλείδωμα στατικής μεταβλητής, δηλαδή το κλείδωμα όλων των παραγγελιών, θα προκαλέσει την ουρά όλων των εντολών, κάτι που είναι προφανώς παράλογο.

Μπορεί λοιπόν η μέθοδος κλειδώματος (αριθμός παραγγελίας) που αναφέρεται στην αρχή αυτού του άρθρου να επιτύχει το επιθυμητό αποτέλεσμα; Ας χρησιμοποιήσουμε λίγο κώδικα για να επαναφέρουμε πρώτα το σενάριο χρήσης.

Εάν αγνοήσετε τις πληροφορίες χρήστη και άλλες επικυρώσεις, ο κώδικας μοιάζει λίγο πολύ με αυτό:
Για τη λέξη-κλειδί κλειδώματος, το MSDN περιλαμβάνει πληροφορίες που μπορούν να βρεθούν στο Baidu και φαίνεται ότι συνιστάται να μην χρησιμοποιείτε το lock(string), και ο λόγος είναι ο ίδιος. Το ακόλουθο απόσπασμα προέρχεται από τις συμβουλές του MSDN σχετικά με τις συμβολοσειρές κλειδώματος:

Το πρόβλημα κλειδώματος ("myLock") παρουσιάζεται επειδή οποιοσδήποτε άλλος κώδικας που χρησιμοποιεί την ίδια συμβολοσειρά στη διαδικασία θα μοιράζεται το ίδιο κλείδωμα.
Αυτή η πρόταση κρύβει έναν τεράστιο μηχανισμό, δηλαδή «την ίδια συμβολοσειρά».

Τι είναι «η ίδια συμβολοσειρά»; Δείτε τον κώδικα:


Είναι τα str1 και str2 η ίδια συμβολοσειρά παραπάνω; Η απάντηση είναι ναι.

Δείτε ξανά:


Το str1 και το str2 παραπάνω εξακολουθούν να είναι η ίδια συμβολοσειρά; Η απάντηση είναι ΟΧΙ.

Εντάξει, ας επιστρέψουμε στο θέμα της πληρωμής της παραγγελίας μας. Στον κώδικά μας, lock(orderNumber), όταν ο χρήστης κάνει κατά λάθος κλικ μερικές ακόμη φορές αφού σύρει το χέρι του, το orderNumber εισάγει αυτήν την ενέργεια την ίδια συμβολοσειρά κάθε φορά; Η απάντηση είναι ΟΧΙ. Αυτό σημαίνει ότι

Ο κώδικας που χειρίζεται την παραπάνω σειρά δεν λειτουργεί στην πραγματικότητα ως κλείδωμα.

Στην πραγματικότητα, υπάρχουν δύο τύποι συγκρίσεων συμβολοσειρών, δείτε τον κώδικα:


Η πρώτη γραμμή του παραπάνω κώδικα εξάγει True και η δεύτερη γραμμή εξάγει False. Πιστεύω ότι καταλαβαίνετε τι εννοεί το MSDN με τον όρο "η ίδια συμβολοσειρά" χωρίς την εξήγησή μου.

Η καλύτερη λύση

Λύσεις για βέλτιστες χορδές ασφάλισης:





Κωδικός επίδειξης:




Στον ιστότοπο, μερικές φορές μπορεί να χρησιμοποιηθεί μια καθολική μεταβλητή, αυτή η καθολική μεταβλητή, όταν πολλοί χρήστες έχουν πρόσβαση ταυτόχρονα, μπορεί να φαίνεται μη φυσιολογική, αυτή τη στιγμή, θα ορίσουμε ένα καθολικό κλείδωμα, αλλά το μειονέκτημα αυτού είναι ότι όλες οι προσβάσεις θα περιμένουν με τη σειρά τους.

Σε ορισμένα σενάρια, για παράδειγμα, ο ίδιος χρήστης μπορεί να σχολιάσει μόνο μία φορά μέσα σε 15 δευτερόλεπτα, εάν χρησιμοποιηθεί το καθολικό κλείδωμα, η επεξεργασία της λειτουργίας σχολίων θα είναι πολύ αργή όταν ο αριθμός των χρηστών αυξάνεται, γεγονός που θα επηρεάσει σημαντικά την εμπειρία χρήστη.

Αυτή τη στιγμή,Μπορούμε να ορίσουμε το κλείδωμα για κάθε χρήστη ξεχωριστά, lock(string){...}, και το όνομα του κλειδώματος μπορεί να οριστεί ως:Όνομα μεθόδου + αναγνωριστικό χρήστηΜε αυτόν τον τρόπο, κάθε χρήστης έχει ένα ανεξάρτητο κλείδωμα και όταν κρίνουμε το διάστημα σχολίων, δεν θα επηρεάσει τα σχόλια άλλων χρηστών.

(Τέλος)




Προηγούμενος:Γραφή τύπου LPSTR του MFC
Επόμενος:Το OpenSSL έχει προφανώς ενημερωθεί, ο Apache εξακολουθεί να ζητά την παλιά έκδοση;
Δημοσιεύτηκε στις 13/5/2022 2:27:17 μ.μ. |
Μπορεί λοιπόν η μέθοδος κλειδώματος (αριθμός παραγγελίας) που αναφέρεται στην αρχή αυτού του άρθρου να επιτύχει το επιθυμητό αποτέλεσμα; Ας χρησιμοποιήσουμε λίγο κώδικα για να επαναφέρουμε πρώτα το σενάριο χρήσης.
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 12/8/2023 7:48:15 μ.μ. |
Το .NET/C# Lock Principle Monitor παρέχει μια εις βάθος εξήγηση
https://www.itsvse.com/thread-9633-1-1.html
Δημοσιεύτηκε στις 7/1/2023 11:22:02 π.μ. |
Το συνάντησα και στην εργασιακή μου πρακτική, χάρη στον συγγραφέα για αυτό το τεχνικό άρθρο
Δημοσιεύτηκε στις 3/7/2019 8:02:32 μ.μ. |
Αυτό είναι καλό πράγμα
Δημοσιεύτηκε στις 18/6/2021 2:24:43 μ.μ. |
Αυτό που εμφανίζεται στη σελίδα είναι ότι ο κώδικας δεν μπορεί να προβληθεί
Δημοσιεύτηκε στις 29/6/2021 12:21:16 π.μ. |
Κοιτάξτε τον κώδικα
Δημοσιεύτηκε στις 29/6/2021 12:54:24 π.μ. |
Δεν μπορώ να δω τον κώδικα
Δημοσιεύτηκε στις 14/5/2022 10:06:46 π.μ. |
Μαθαίνω να μαθαίνω
Δημοσιεύτηκε στις 28/5/2022 10:03:59 μ.μ. |
Πολύ καλό, μαθημένο
Δημοσιεύτηκε στις 28/11/2022 9:46:47 μ.μ. |
Μπορεί να χρησιμοποιηθεί asp.net;
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com